使用所选元素创建对角矩阵

时间:2015-10-30 18:37:27

标签: matlab matrix diagonal

我有一个名为4x5的{​​{1}}矩阵,我想从中随机选择3行,然后选择4个随机列,然后选择那些在所选行和列中重合的元素,这样我就有12个然后我要创建一个名为A的对角矩阵,它将具有1或0的条目,以便将B矩阵与重新整形的B矩阵(A相乘)会给我20x1选定的12个元素。

如何创建A矩阵?这是我的代码:

B

2 个答案:

答案 0 :(得分:4)

有点难以理解你想要什么,而你的代码并没有多大帮助,但我认为我已经为你提供了解决方案。

我创建一个与A大小相同的零的矩阵(向量),然后使用bsxfun来确定此向量中的索引(它将是B的对角线)那应该是1

>> A = reshape(1:20, 4, 5);
>> R = [1 2 3]; % Random rows
>> C = [2 3 4 5]; % Random columns
>> B = zeros(size(A));
>> B(bsxfun(@plus, C, size(A, 1)*(R-1).')) = 1;
>> B = diag(B(:));
>> V = B*A(:);
>> V = V(V ~= 0)
V =
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13

注意:不需要B = diag(B(:));我们可以在Matlab中简单地使用元素乘法。

>> V = B(:).*A(:);
>> V = V(V ~= 0)

注意:这可能过于复杂或非常糟糕,并且可能有更好的方法。这是我第一次尝试自己使用bsxfun

答案 1 :(得分:0)

这是一个黑客,但是既然你正在创建y2,你也可以使用它而不是创建无用的B矩阵。 bsxfun答案要好得多。

A=1:20;
A=reshape(A,4,5);
Mr=4;
Ma=3;
Na=4;
Nr=5;
M=Ma*Mr;
[S1,S2]=size(A);
N=S1*S2;
y2=zeros(size(A));
k1=randperm(S1);
k1=k1(1:Ma);
k2=randperm(S2);
k2=k2(1:Mr);
y2(k1,k2)=A(k1,k2);
idx = reshape(y2 ~= 0, numel(y2), []);
B = diag(idx);
% "diagonal" matrix 12x20
B = B(all(B==0,2),:) = [];
output = B * A(:)

输出=

 1
 3
 4
 9
11
12
13
15
16
17
19
20

来自示例的y2。

y2 =

 1     0     9    13    17
 0     0     0     0     0
 3     0    11    15    19
 4     0    12    16    20