首页 文章

Matlab:将不同长度的行叠加到矩阵上

提问于
浏览
1

如何在Matlab中将不同长度的行叠加到矩阵上?也就是说,我希望矩阵A的行z中的前x个元素和最后y个元素为零,其中x和y在长度为Z的两个列向量中指定(因此对应于矩阵的行数)一个) . 我只能想到一个简单循环的解决方案,但我正在寻找一个更优雅的解决方案,避免使用循环,因为这段代码需要在主循环中运行数千次 .

编辑

正如@randomatlabuser所证实的那样,这就是提问者在没有循环的情况下想做的事情:

M = 1e4; N = 1e3; A = randn(M, N);
x = randi([0, N], [M, 1]);
y = randi([0, N], [M, 1]);
for hh = 1:M
  A(hh, 1:x(hh)) = 0;
  A(hh, (N - y(hh) + 1):N) = 0;
end

2 回答

  • 1

    你可以这样做:

    A = rand(4,6); %// example data
    x = [1; 2; 1; 3]; %// example data
    y = [1; 2; 1; 2]; %// example data
    
    [M N] = size(A);
    col = 1:N;
    B = A.* ( bsxfun(@gt, col, x) & bsxfun(@le, col, (N-y)) );
    

    这个例子的结果是:

    >> A
    
    A =
    
        0.0168    0.8797    0.7367    0.9859    0.5385    0.9745
        0.9274    0.4161    0.0567    0.0649    0.7961    0.1616
        0.3935    0.8690    0.8386    0.0308    0.5494    0.5525
        0.7615    0.1895    0.0002    0.0919    0.7167    0.6101
    
    >> B
    
    B =
    
             0    0.8797    0.7367    0.9859    0.5385         0
             0         0    0.0567    0.0649         0         0
             0    0.8690    0.8386    0.0308    0.5494         0
             0         0         0    0.0919         0         0
    

    如果在主循环的所有迭代中 xy 相同,则可以通过在循环之前计算掩码来节省时间:

    [M N] = size(A);
    col = 1:N;
    mask = bsxfun(@gt, col, x) & bsxfun(@le, col, (N-y));
    

    然后在每次迭代时你只需要应用预先计算的掩码:

    B = A.*mask;
    
  • 1

    你想要做的是:

    M = 1e4; N = 1e3; A = randn(M, N);
    x = randi([0, N], [M, 1]);
    y = randi([0, N], [M, 1]);
    for hh = 1:M
      A(hh, 1:x(hh)) = 0;
      A(hh, (N - y(hh) + 1):N) = 0;
    end
    

    但没有循环,对吗?

相关问题