【问题标题】:Reshape and rearrange array重塑和重新排列数组
【发布时间】:2016-08-28 00:37:46
【问题描述】:

我有一个大数组,如下所示:

1
4
5
3
6
2
7
4
3

我想重新排列这个数组,它看起来像这样:

7 4 3
3 6 2
1 4 5

我的原始数组大小为 13700x1,所以我无法手动完成,如果我使用 reshape 函数,数组的形状会错误:

1 3 7
4 6 4
5 2 3

我希望我的意图很明确。谢谢!

【问题讨论】:

    标签: arrays matlab reshape


    【解决方案1】:

    试试

    tmpArray = [1
    4
    5
    3
    6
    2
    7
    4
    3]
    
    flipud(reshape(tmpArray, 3, 3).')
    

    【讨论】:

    • 注意:这假设向量具有平方数量的元素,但事实并非如此。因此,对于 OP 的数据集,它将失败。
    【解决方案2】:
    x = [1,4,5,3,6,2,7,4,3]';
    A = flipud(reshape(x,3,3)');
    

    【讨论】:

    • 如果您不知道,并且对于 OP:.' 是转置,而不是 '。但是,它方便地适用于只有实数的矩阵。始终使用.' 来避免不良习惯是一个好习惯。但很好的答案=)
    • @StewieGriffin 不,我不知道!那么什么是',复共轭?
    • 注意:这假设向量具有平方数量的元素,但事实并非如此。因此,对于 OP 的数据集,它将失败。
    • 你的意思是 13400x1 向量?我有点假设 MWE 的平方结果只是一个任意形状,他知道他想将向量重塑成什么形状。
    • 可能是这样,如果是这样,那么你是对的(你和亚历克斯几个小时前得到了我的支持 =))。提示:reshape(x,3,[])。您可以不定义一维。这样,即使元素数量发生变化,代码也能正常工作(假设它仍然是 3 的倍数)。这比:reshape(x,3,numel(x)/3) 简单一些。
    【解决方案3】:

    其他答案假设您的向量包含平方数量的元素,4, 9, 16 ...。这对于示例向量是正确的,但对于您实际使用的向量却不是(根据问题,它是 13700x1)。

    这意味着flipud(reshape())方法会报错:

    已知维度的乘积,3,不能整除 元素,13924。

    如果您不想要方阵,这不是问题,因为数字可以表示为任何数字的乘积:2, 5, 137

    如果你想要一个方阵,你需要用零、NaN 或其他东西填充向量。这可以通过以下方式完成:

    A = randi(100,13700,1);        %% Random 13700x1 matrix
    n = numel(A);                  %% Number of elements in A (13700 in this case)
    elements = ceil(sqrt(n))^2;    %% Number of elements needed in order to make a square matrix
    B = [A; zeros(elements-n,1)];  %% Pad the vectors with zeros.
                                   %% You can also d0 B = [A; nan(elements-n,1)];
    final_matrix = flipud(reshape(B, sqrt(elements),[]).');  %% Final operation
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 2012-08-11
      • 2023-01-23
      • 2021-03-03
      相关资源
      最近更新 更多