2013-12-01 2 views
2

У меня есть две матрицы больших размеров, что-то похожее на следующие матрицы.Вычитая каждый элемент вектора строки, размер (1 x n) из матрицы размера (m x n)

m; с размером 1000 на 10 n; с размером 1 по 10.

Я хотел бы вычесть каждый элемент п из всех элементов т, чтобы получить десять разных матрицы, каждый из них имеет размер 1000 на 10.

я начал следующий

clc;clear; 
nrow = 10000; 
ncol = 10; 
t = length(n) 
for i = 1:nrow; 
    for j = 1:ncol; 
     for t = 1:length(n); 
     m1(i,j) = m(i,j)-n(1); 
     m2(i,j) = m(i,j)-n(2); 
     m3(i,j) = m(i,j)-n(3); 
     m4(i,j) = m(i,j)-n(4); 
     m5(i,j) = m(i,j)-n(5); 
     m6(i,j) = m(i,j)-n(6); 
     m7(i,j) = m(i,j)-n(7); 
     m8(i,j) = m(i,j)-n(8); 
     m9(i,j) = m(i,j)-n(9); 
     m10(i,j) = m(i,j)-n(10); 
     end 
    end 
end 

Может ли кто-нибудь помочь мне, как я могу это сделать без написания десяти уравнений внутри цикла? Или можете предложить мне удобный способ, особенно когда две матрицы имеют много столбцов.

ответ

2

Почему вы не можете просто сделать это:

m01 = m - n(1); 
... 
m10 = m - n(10); 

Что вам нужно петля для?

Еще лучше:

N = length(n); 
m2 = cell(N, 1); 
for k = 1:N 
    m2{k} = m - n(k); 
end 
+0

Спасибо большое, он работает. вы спасли мое время. Это было прекрасно, если я пришел на этот сайт немного раньше. – user3054580

+0

Опять же, я хотел бы подсчитать количество отрицательных элементов в каждом столбце результирующих матриц. Как я могу сделать это внутри цикла, который вы мне дали раньше? – user3054580

1

Создать трехмерную матрицу результата. Сохраните ваши результаты, например, в третьем измерении.

clc;clear; 
nrow = 10000; 
ncol = 10; 
N = length(n); 
resultMatrix = zeros(nrow, ncol, N); 
neg = zeros(ncol, N); % amount of negative values 
for j = 1:ncol 
    for i = 1:nrow 
     for t = 1:N 
      resultMatrix(i,j,t) = m(i,j) - n(t); 
     end 
    end 
    for t = 1:N 
     neg(j,t) = length(find(resultMatrix(:,j,t) < 0)); 
    end 
end 
+0

Большое спасибо, он работает. вы спасли мое время.Это было прекрасно, если я пришел на этот сайт немного раньше. – user3054580

+0

Опять же, я хотел бы подсчитать количество отрицательных элементов в каждом столбце полученных матриц. Как я могу сделать это внутри цикла, который вы мне дали раньше? – user3054580

+0

Я отредактировал свой ответ. Попробуй. Пожалуйста, отметьте мой ответ как принятый, если это лучшее решение для вас :) –

2

Здесь мы идем loopless:

nrow = 10000; 
ncol = 10; 

%example data 
m = ones(nrow,ncol); 
n = 1:ncol; 

M = repmat(m,1,1,ncol); 
N = permute(repmat(n,nrow,1,ncol) , [1 3 2]); 
result = bsxfun(@minus, M, N); 
%or just 
result = M-N; 

истекшее время 0.018499 секунд.

или в соответствии с рекомендациями Луис Mendo:

M = repmat(m,1,1,ncol); 
result = bsxfun(@minus, m, permute(n, [1 3 2])); 

Прошедшее время 0.000094 секунд.

Пожалуйста, убедитесь, что ваши векторы ввода имеют такую ​​же ориентацию, как в моем примере, иначе вы можете попасть в неприятности. Вы должны иметь возможность получить это путем транспонирования или вам нужно изменить эту строку:

permute(repmat(n,nrow,1,ncol) , [1 3 2]) 

в соответствии с вашими потребностями.


Вы упомянули в комментариях, что вы хотите, чтобы сосчитать отрицательные элементы в каждом из полученных столбцов:

A = result;     %backup results 
A(A > 0) = 0;    %set non-negative elements to zero 
D = sum(logical(A),3); 

, который возвратит желаемый 10000x10 матрицу с количеством отрицательных элементов. (Пожалуйста, подтвердите это, я могу немного запутаться с размерами;))

+0

'bsxfun' намного лучше, чем' for'. Но вам не нужны два 'repmat'! Фактически, 'bsxfun' предназначен для более эффективного использования' repmat'. Просто используйте 'result = bsxfun (@minus, m, permute (n, [1 3 2]));' –

+0

@LuisMendo ничего себе, это отличное улучшение! благодаря! – thewaywewalk

+0

Добро пожаловать! Обратите внимание, что код затем сводится только к одной строке (нет необходимости в 'M'). И если вы сохраняете версию' repmat', 'bsxfun' не требуется: просто используйте' result = MN; '(как' M' и 'N' уже соответствуют размерам) –

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