【问题标题】:creating diagonal matrix with selected elements使用选定元素创建对角矩阵
【发布时间】:2015-10-30 18:37:27
【问题描述】:

我有一个名为 A4x5 矩阵,我想从中随机选择 3 行,然后是 4 个随机列,然后选择在这些选定的行和列中重合的元素,这样我就有 12 个选定的元素。然后我想创建一个名为 B 的对角矩阵,它的条目为 1 或 0,以便将 B 矩阵与重构的 A 矩阵 (20x1) 相乘,将为我提供A 中选定的 12 个元素.

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

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

【问题讨论】:

  • @Adriaan yapp 抱歉我编辑了它。
  • 你不能有一个对角矩阵来解决这个问题。您可以填充 B 的某些值以通过乘法实现您想要的结果,但它肯定不会是对角线。将对角矩阵与向量相乘只会返回该向量的缩放分量......除非您打算在最终向量中用 0 替换那些未选择的值。请澄清您是否真的是指对角矩阵。
  • @rayryeng 我认为他的意思是对角矩阵将有一个 0 用于它不应该返回的值和一个 1 用于它应该返回的值。由于1B 中的1A*B 的结果将是一个具有 12 个非零值的 20 元素向量。抱歉,这可能对您没有帮助,但是对角矩阵可以解决问题,尽管我不知道为什么 B 不能是向量和使用逐个元素的乘法。
  • @IKavanagh 这是真的,这就是为什么我很困惑......这就是为什么我还没有写一个答案。
  • 那么你想要的是B,其中y3 = A*By3 = y2(y2 ~= 0)?这个问题非常不清楚。对于您提供的示例,很确定 B 不能是对角线。

标签: matlab matrix diagonal


【解决方案1】:

有点难以理解你想要什么,你的代码也帮不上什么忙,但我想我有一个适合你的解决方案。

我创建了一个与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

【讨论】:

  • 欢迎来到bsxfun 的世界。你的兄弟们在等着你,Divakar 是我们的第一名!
  • bsxfun 太有趣了!
  • 伙计们,我不明白它的含义,但我不需要输出选择的 12 个元素。实际上我需要那个对角线 B 矩阵。而且在这里我写了一个示例 A 矩阵。实际上我的矩阵的大小为 512x512,因此创建 B 矩阵是不可能的,我认为我应该使用稀疏函数。对吗?
  • @Nanor 我真的很困惑。为什么需要对角矩阵?你不能使用逐个元素的乘法吗?
  • @IKavanagh 因为我的主要代码的其他部分也使用了对角矩阵 B。所以我需要它
【解决方案2】:

这是一个 hack,但由于您正在创建 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多