【问题标题】:Convert row vector to matrix将行向量转换为矩阵
【发布时间】:2015-10-07 05:11:04
【问题描述】:

我需要编写将行向量转换为矩阵的代码。例如,如果我有a = 1 2 3 4 5 6 7 8 9,我希望矩阵是:

m = [1 2 3; 
     4 5 6; 
     7 8 9]

我有这个,它不起作用。谁能帮帮我?

for i=1:length(a)
    m = a(i);
    i = i + 1;
end

此外,我不允许使用任何Matlab的内置函数(例如reshape)。

【问题讨论】:

  • 我不能使用 vec2mat 或 reshape
  • 如果你的向量是 1x8,矩阵是 2x4 还是 4x2?还是仅适用于 3x3?如果您创建一个具有您希望结果大小的零矩阵(例如,A=zeros(3,3)),那么您可以使用A(:)=a。您必须检查元素是否位于矩阵中的正确位置。
  • 在 SO 上发布家庭作业通常不受欢迎,但正如你展示了你所尝试的那样,+1 =) 看看 Shai 对你的问题的编辑(你可以点击“编辑的 x 分钟前”链接)。你原来的循环不漂亮=)
  • 请注意,for 循环会自动增加循环索引。 Matlab 中的循环语句for i= 1:length(a) 类似于java 或c++ 中的for (int i=1; i<=length(a); i++)。但是,可以假设实现比这更复杂,因为for i=a 将执行与for (T t : a) 类似的行为,其中 T 是它的类型。所以关键是你不需要在循环中增加i。它在 for 循环中隐式完成。

标签: matlab matrix vector reshape


【解决方案1】:

使用重塑

a = [1 2 3 4 5 6 7 8 9];
A = reshape(a, 3, [])'

第三个参数是自动获取的(列数)

或者,如果您不能使用任何 MATLAB 内置函数,请在此处使用此函数

A = zeros(3,3); %// or A(3,3) = 0 by thewaywewalk (thank you)
A(:) = a;
A = A';

【讨论】:

  • 我不能使用任何 MATLAB 函数。
  • 如果zeros也是禁止使用的功能,可以使用A(3,3) = 0进行预分配。
  • @thewaywewalk 在任何情况下zeros(N,M) 实际上比A(N,M) = 0; 更受欢迎吗? zeros 当然更安全,因为这不会修改现有变量。但是,如果您处于这种情况下,无论如何您几乎都被搞砸了。
【解决方案2】:

当然,使用reshape 是将向量转换为矩阵的正确方法。
但是,由于您不想使用任何 Matlab 函数,因此可以使用循环

A = zeros(3,3); %// preallocate
for ii=1:3,
    A(ii,:) = a( (ii-1)*3 + 1:3 ); %// put one row into place
end

或者,更一般地说,如果您想将H*W 向量重塑为H-by-W 矩阵:

A = zeros(H,W);
for ii=1:H
    A( ii, : ) = a( (ii-1)*W + 1:W );
end

PS,
注意最好not to use i as a variable name in Matlab

【讨论】:

    猜你喜欢
    • 2016-04-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多