我是MATLAB编程的新手,无法解决以下问题
我有一个大小为A
的矩阵示例:1 * 16,例如
A = [.01 0 0 0 .42 0 0 0 .13 0 0 0 .09 0 0 .32]
和另一个大小为16 * 16的矩阵B
,其中所有列的值都相同
B = [.12 .18 .08 .17 .43 .13 .13 .24 .09 .11 .04 .08 .10 .15 .08 .43]
每一行与第一行相同。
我想将B
的列替换为A
列,但如果0
中存在A
,我应保留该B
的值列相同。
我希望输出为16 * 16矩阵,样本行矩阵C
为:
C = [.01 .18 .08 .17 .42 .13 .13 .24 .13 .11 .04 .08 .09 .15 .08 .32]
我很乐意得到支持。
答案 0 :(得分:2)
您可以使用logical indexing完成此操作:
A = [.01 0 0 0 .42 0 0 0 .13 0 0 0 .09 0 0 .32];
B = [.12 .18 .08 .17 .43 .13 .13 .24 .09 .11 .04 .08 .10 .15 .08 .43];
C = A; % Use A as a starting point
C(A==0) = B(A==0);
C = repmat(C, 16, 1);
要稍微分解一下,逻辑equal
(==
)在应用于数组时会返回一个大小相同的数组true
,其中满足条件且{ {1}}当它不是时。如果索引与逻辑数组大小相同的数组,则返回值是逻辑数组为false
的数组值。
例如,如果我们这样做:
true
我们得到以下回报:
myarray = [1 2 3 4];
test = myarray < 3;
现在,如果我们使用test =
1 1 0 0
索引myarray
:
test
我们获得:
newarray = myarray(test);
为了更进一步,我们可以采取以下措施与上述解决方案保持一致:
newarray =
1 2
返回:
newarray = zeros(size(myarray));
newarray(test) = myarray(test);
答案 1 :(得分:2)
k = find(A);
C = B(1,:);
C(k) = A(k);
B = repmat( C,16,1);
它不像其他答案那么优雅,但它只显示如何为16x16矩阵B
而非1x16。
答案 2 :(得分:1)
C=B;
C(A~=0) = A(A~=0)
C =
0.0100 0.1800 0.0800 0.1700 0.4200 0.1300 0.1300 0.2400 0.1300 0.1100 0.0400 0.0800 0.0900 0.1500 0.0800 0.3200
当然,使用逻辑索引。
要获得相等行的完整矩阵,请使用repmat
:
C = repmat( C,16,1);
但是如果你只想访问值,你最好坚持使用矢量形式,因为它使用更少的内存。