2013-02-11 5 views
0

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

10 0.261344
11 0.456167
12 0.668595
2 0.481754
... etc

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

10-11 -0.194823
10-12 -0.407251
... etc

другими словами разница между 1-й строки и все остальное, 2-й ряд и все остальное .. исключая те строки, из которых 1-й столбец имеет те же значения, что и в первом файле M excel 1-го столбца. что делает в общей разнице по сравнению с 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, любая помощь высоко ценится, а также если вы можете посоветовать несколько руководств или учебных пособий, кроме помощи по математике. Большое спасибо.

+1

Назад на минуту и ​​убедитесь, что первая часть этого кода работает так, как вы намерены. Опечатки затрудняют определение, но, например, результат «horzcat (m {:})» не сохраняется ни в какой переменной. Затем напишите небольшой тестовый пример, который начинается с введенных вручную матриц, чтобы у людей было что-то, с чем можно было работать, чтобы проверить/продемонстрировать решения вашей проблемы. – tmpearce

ответ

1

Let D be n by 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 | х 2 массив, в котором

d(ii, jj, :) = D(idx(ii), :) - D(idx(jj), :) 
+0

Привет, Спасибо за ваш ответ. Я пытаюсь реализовать этот метод. У меня есть несколько вопросов. в выражении bsxfun, когда вы ставите точки после первой перестановки, что вы умеете? Я просто опустил его. Также последнее выражение дает мне ошибку: «Несоответствие размера подзаголовки». когда я поставил ii и jj в цикл: для ii, jj = 1: d_size. Вот как я думал об определении ii и jj. в противном случае я получаю ошибку: «Неопределенная функция или переменная« ii », если я не упоминаю цикл. Я знаю, это может показаться тривиальным вопросом, но я бы очень признателен за объяснение. Спасибо! – mil

+0

@mil Что касается трех точек: в matlab, если у вас есть выражение длиннее одной строки, вы можете разрезать его на несколько строк и поместить «...» в конец каждой (частичной) строки. см. [matlab doc] (http://www.mathworks.com/help/matlab/matlab_prog/continue-long-statements-on-multiple-lines.html). – Shai

+0

@mil Относительно последнего выражения 'd (ii, jj,:) = D (idx (ii), :) - D (idx (jj),:)' Я сделал ** не ** означает его как команду Matlab , Я имел в виду это как общий оператор, для каждого 'ii' и' jj' (в диапазоне) diff 'D (idx (ii), :) - D (idx (jj),:)' хранится в 'd (II, JJ, :) '. – Shai

 Смежные вопросы

  • Нет связанных вопросов^_^