bsxfun вычитание строк в цикле

У меня есть текстовый файл D с 98 строками и 2 столбцами. выглядит так:

10 0,261344
11 0,456167
12 0,668595
2 0,481754
... и т.д.

У меня есть еще один файл Excel M с 17 строками и 2 столбцами.
Я хочу вычесть значения всех строк из 1-й строки, затем из 2 и т. д., поэтому я получаю что-то вроде этого:

10-11 -0,194823
10-12 -0,407251
... и т.д.

другими словами, разница между 1-й строкой и всеми остальными, 2-й строкой и всеми остальными ... за исключением тех строк, в которых 1-й столбец имеет те же значения, что и во 2-м столбце 1-го файла M excel. что делает общую разницу по сравнению с 81 строкой.

я пытался использовать это:

M = xlsread('...');    

FSumID=fopen(D);
 MatrixSub = loadD);
 m = textscan(FSumID,'%d %f');
horzcat(m{:}) 

NewData = M(:,1)
D_size=size(D);

for i=1:D_size

 if (ptvBodyDist(:,1)~=NewData(i))
%for calculating 
 DVec = bsxfun(@minus, ((m{i,2})), (m{i,2}));

% когда я проверяю это, он дает только один цикл со всеми нулями (98,1), в то время как мне нужно (((98-17) ^ 2,1). Мне нужно изменить последнюю часть выражения, чтобы получить то, что я хочу, но я' я застрял с bsxfun, я не знаю, как сделать правильное выражение, чтобы вычесть все строки.

Я новичок в Matlab, любая помощь будет очень признательна. также, если бы вы могли предложить некоторые руководства или учебные пособия, помимо помощи по математике. Большое спасибо.


person mil    schedule 11.02.2013    source источник
comment
Сделайте резервную копию на минуту и ​​убедитесь, что первая часть этого кода работает так, как вы задумали. Опечатки затрудняют определение, но, например, результат horzcat(m{:}) вообще не сохраняется ни в какую переменную. Затем напишите небольшой тестовый пример, который начинается с матриц, введенных вручную, чтобы людям было с чем поработать для тестирования/демонстрации решений вашей проблемы.   -  person tmpearce    schedule 11.02.2013


Ответы (1)


Пусть D будет матрицей n на 2 (данные из текстового файла).
Пусть M на m на 2 матрица (данные из файла Excel).

Первый этап заключается в поиске соответствующих n-m строк из D: строк, первое значение которых отсутствует в M, с помощью setdiff.

[~, idx] = setdiff( D( :, 1 ), M( :, 1 ), 'stable' );

Теперь мы можем вычислить разницу между всеми и всеми, используя bsxfun.

d = bsxfun( @minus, permute( D( idx, : ), [1 3 2] ), ...
                    permute( D( idx, : ), [3 1 2] ) );

Теперь d - это массив |idx|x|idx|x2, где

d( ii, jj, : ) = D( idx(ii), :) - D( idx(jj), : )
person Shai    schedule 11.02.2013
comment
Привет, спасибо за ваш ответ. Я пытался реализовать этот метод. У меня есть несколько вопросов. в выражении bsxfun, когда вы ставите точки после первой перестановки, что вы этим хотите сказать? я просто пропустил это. Также последнее выражение дает мне ошибку: несоответствие размера назначения с подпиской. когда я помещаю ii и jj в цикл: for ii,jj=1:d_size. вот как я думал об определении ii и jj. в противном случае я получаю сообщение об ошибке: неопределенная функция или переменная «ii», если я не упомянул цикл. Я знаю, что это может показаться тривиальным вопросом, но я был бы очень признателен за объяснение. Спасибо! - person mil; 12.02.2013
comment
@mil Что касается трех точек: в Matlab, если у вас есть выражение длиннее одной строки, вы можете разрезать его на несколько строк и поставить «...» в конце каждой (частичной) строки. см. документ Matlab. - person Shai; 12.02.2013
comment
@mil Что касается последнего выражения d( ii, jj, : ) = D( idx(ii), :) - D( idx(jj), : ), я не имел в виду его как команду Matlab. Я имел в виду это как общее утверждение, для каждого ii и jj (в диапазоне) разница D( idx(ii), :) - D( idx(jj), : ) хранится в d(ii,jj,:). - person Shai; 12.02.2013
comment
Еще раз спасибо за вашу помощь. относительно D(idx(ii), :) - D(idx(jj),:) хранится в d(ii,jj,:).. Мне нужно, чтобы результат был d(6561,2).который исходит из rows = 81*81,col =2 . Дает ли это результат d(ii, jj, : )? Я все еще пытаюсь понять d( ii, jj, : ) = D( idx(ii), :) - D( idx(jj), : ). Не могли бы вы объяснить это немного подробнее, пожалуйста? Большое спасибо! - person mil; 13.02.2013
comment
@mil попробуйте код на небольшом примере и проверьте содержимое результирующих массивов. Кроме того, вы можете использовать reshape для преобразования результирующего массива в желаемые размеры. - person Shai; 13.02.2013
comment
Спасибо Шай! Я работаю над этим сейчас-ваши советы очень помогли! - person mil; 15.02.2013
comment
Привет! В предыдущем ответе он также вычитает 1-й столбец и представляет их в D (:,:, 1), в то время как мне нужно их сохранить, и на самом деле мне нужно, чтобы они отображались как 10-11,10-12,10-2( т.е. какой столбец был вычтен из какого)..и т.д..не могли бы вы помочь, как это можно сделать? Заранее спасибо! - person mil; 04.03.2013