从大小矩阵(m x n)中减去行向量的每个元素,大小(1 x n)

时间:2013-12-01 14:53:47

标签: matlab

我有两个大尺寸的矩阵,类似于下面的矩阵。

米;大小1000乘10 N;大小为1比10。

我想从m的所有元素中减去n的每个元素,得到十个不同的矩阵,每个矩阵的大小为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

任何人都可以帮助我,如果不在循环中编写十个方程式,我该怎么办呢?或者可以建议我任何方便的方式,特别是当两个矩阵有很多列时。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

这里我们无环路:

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秒。

或按路易斯·门多的建议:

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 矩阵,其中包含大量负数元素。 (请验证它,我可能会对尺寸有点混淆;))

答案 2 :(得分: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