如何在Matlab中将不同长度的行叠加到矩阵上?也就是说,我希望矩阵A的z行中的第一个x元素数和最后的y元素数为零,x和y在长度Z的两个列向量中指定(因此对应于矩阵A的行数)。我只能从简单循环的角度考虑解决方案,但我正在寻找一种更优雅的解决方案,避免使用循环,因为这段代码需要在主循环中运行数千次。
编辑
正如@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发布于 2013-11-25 11:30:22
你可以这样做:
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如果x和y在主循环的所有迭代中相同,则可以通过在循环之前计算掩码来节省时间:
[M N] = size(A);
col = 1:N;
mask = bsxfun(@gt, col, x) & bsxfun(@le, col, (N-y));然后,在每次迭代时,只需应用预先计算的掩码:
B = A.*mask;发布于 2013-11-24 23:55:04
你想做的是:
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但没有循环,对吧?
https://stackoverflow.com/questions/20181653
复制相似问题