dfarr1 Ответов: 2

Могу ли я получить некоторую помощь с эквивалентом массива java в C#?


Привет,
У меня есть программа, которая заполняет список & lt;float> c_dat и t_dat с помощью 2, 4 или 6 цифры за раз. Затем следующий шаг делает некоторую математику, чтобы вычислить дисперсию и отслеживать вещи, добавляя их. Проблема в том, что элемент qC[0] довольно часто равен 0, и это вызывает у меня много проблем позже в коде, пытающемся сделать больше вычислений. Я не специалист по python - могу ли я получить некоторые рекомендации по следующему фрагменту кода?

if C_count >= 0 and T_count >= 0:
	
	qC=[0.0,0.0]
	qT=[0.0,0.0]
						
	for j in range(len(C_dat)/2):
		#print dip_dat[2*j],dip_dat[2*j+1]
		m = C_dat[2*j]+C_dat[2*j+1]
		qC[0]+= float(C_dat[2*j])	# ref allele freq						
		qC[1]+= float(m)
	for j in range(len(T_dat)/2):
		m = T_dat[2*j]+T_dat[2*j+1]
		qT[0]+= float(T_dat[2*j])	# ref allele freq						
		qT[1]+= float(m)

	#print qT[1],qC[1]						
	if (qT[1] >= Min_reads and qC[1] >= Min_reads):
# Here I am outputting a standardized data format
# columns: scaffold, position, ref allele count 1, total count 1,ref allele count 2, total count 2
		outkk.write(cols[0]+"\t"+cols[1]+"\t"+str(qC[0])+"\t"+str(qC[1])+"\t"+str(qT[0])+"\t"+str(qT[1])+"\n")
		outcomes[2]+=1#print "here"
		Locations.append(cols[0]+"_"+cols[1])
		num_snps+=1
		qC_hat=qC[0]/qC[1]
		qT_hat=qT[0]/qT[1]

		var_C = 1.0/qC[1]
		var_T = 1.0/qT[1]


Что я уже пробовал:

Я пробовал делать двойные и плавающие переменные, которые просто добавляются к таким, как qC и qC_m, и я пробовал arraylists и списки, но результаты те же.

Вот моя текущая версия, но она не работает...
if (C_count >= 0 && T_count >= 0)
    {

        double[] qC = { 0.0, 0.0 };
        double[] qT = { 0.0, 0.0 };


        var range1 = Enumerable.Range(0, (C_dat.Count / 2));
        foreach (int i in range1)
        {
            double m = Convert.ToDouble(C_dat[2 * i]) + Convert.ToDouble(C_dat[2 * i + 1]);
            //qC[0] is fairly consistently 0
            qC[0] = qC[0] + Convert.ToDouble(C_dat[2 * i]);
            if (C_dat.Count == 2 && qC[0] == 0)
            {
                Console.WriteLine(" C_dat count = " + C_dat.Count + " referencing C_dat[2*i] or C_dat " + 2 * i + " item = " + C_dat[2 * i]);
            }
            qC[1] = qC[1] + m;

        }
        var range2 = Enumerable.Range(0,(T_dat.Count/2));
        foreach (int i in range2)
        {
            double m = Convert.ToDouble(T_dat[2 * i]) + Convert.ToDouble(T_dat[2 * i + 1]);
            qT[0] = qT[0] + Convert.ToDouble(T_dat[2 * i]);
            qT[1] = qT[1] + m;
        }

        if (qT[1] >= min_reads && qC[1] >= min_reads)
        {
            //skipping output for yut file
            Locations.Add(cols[0] + "_" + cols[1]);
            num_snps++;
            double qC_hat = qC[0] / qC[1];
            double qT_hat = qT[0] / qT[1];
            double var_C = 1.0 / qC[1];
            double var_T = 1.0 / qT[1];

2 Ответов

Рейтинг:
2

takatok

Код функционально эквивалентен. Вы говорите, что ваша проблема заключается в том, что qc[0] часто равен 0 и это вызывает проблемы. С помощью вашего кода Вы берете некоторый массив C_dat и преобразуете каждый четный индекс этого массива (0,2,4 и т. д.) В двойной и добавляете его в qc[0]. Таким образом, единственная причина, по которой qc[0] должен быть равен 0, заключается в том, что каждый четный индекс C_dat равен 0. Вы должны заглянуть в свой код и понять, почему это происходит.


Рейтинг:
1

Patrice T

Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


dfarr1

Этот фрагмент вышел из 3-уровневого вложенного цикла в программе, которая анализирует различия в отдельных нуклеотидах по всему геному. Отладка-это здорово, но я не могу интерпретировать переменные построчно. Я сузил проблему до того, что, по моему мнению, является ошибкой транскрибирования и заполнения массива, но поскольку Python более свободен, чем мне удобно, я попросил кого-нибудь проверить и посмотреть, является ли моя интерпретация функционально эквивалентной или есть лучший способ перевести этот фрагмент.

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.