我有两个大尺寸的矩阵,类似于下面的矩阵。
米;大小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
任何人都可以帮助我,如果不在循环中编写十个方程式,我该怎么办呢?或者可以建议我任何方便的方式,特别是当两个矩阵有很多列时。
答案 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