【问题标题】:Subtracting each elements of a row vector , size (1 x n) from a matrix of size (m x n)从大小为 (m x n) 的矩阵中减去行向量 、大小 (1 x n) 的每个元素
【发布时间】:2013-12-01 14:53:46
【问题描述】:

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

米;尺寸为 1000 x 10 n;尺寸为 1 x 10。

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

任何人都可以帮助我在不写循环内的十个方程式的情况下如何做到这一点?或者可以建议我任何方便的方法,尤其是当两个矩阵有很多列时。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    你为什么不能这样做:

    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
    

    【讨论】:

    • 再次,我想计算结果矩阵每列中负元素的数量。我怎样才能在你之前给我的循环中做到这一点?
    【解决方案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 秒。

    或按照 Luis 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 矩阵。 (请验证一下,我可能对尺寸有点困惑;))

    【讨论】:

    • bsxfunfor 好得多。但是你不需要这两个repmat!事实上,bsxfun 旨在更有效地替换repmat。只需使用result = bsxfun(@minus, m, permute(n, [1 3 2]) );
    • 欢迎您!请注意,代码然后减少到只有那一行(不需要M)如果您保留repmat 版本,则不需要bsxfun:只需使用result = M-N;(如MN尺寸已经匹配)
    【解决方案3】:

    创建三维结果矩阵。例如,将结果存储在三维中。

    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
    

    【讨论】:

    • 再次,我想计算结果矩阵每列中负元素的数量。我怎样才能在你之前给我的循环中做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多