将一列矩阵大小1 * n的值替换为另一个大小为n * n的矩阵

时间:2015-11-10 12:37:17

标签: arrays matlab matrix

我是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]

我很乐意得到支持。

3 个答案:

答案 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);

但是如果你只想访问值,你最好坚持使用矢量形式,因为它使用更少的内存。