我有一个名为4x5
的{{1}}矩阵,我想从中随机选择3行,然后选择4个随机列,然后选择那些在所选行和列中重合的元素,这样我就有12个然后我要创建一个名为A
的对角矩阵,它将具有1或0的条目,以便将B
矩阵与重新整形的B
矩阵(A
相乘)会给我20x1
选定的12个元素。
如何创建A
矩阵?这是我的代码:
B
答案 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