【发布时间】: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
我希望我的意图很明确。谢谢!
【问题讨论】:
我有一个大数组,如下所示:
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
我希望我的意图很明确。谢谢!
【问题讨论】:
试试
tmpArray = [1
4
5
3
6
2
7
4
3]
flipud(reshape(tmpArray, 3, 3).')
【讨论】:
x = [1,4,5,3,6,2,7,4,3]';
A = flipud(reshape(x,3,3)');
【讨论】:
.' 是转置,而不是 '。但是,它方便地适用于只有实数的矩阵。始终使用.' 来避免不良习惯是一个好习惯。但很好的答案=)
',复共轭?
reshape(x,3,[])。您可以不定义一维。这样,即使元素数量发生变化,代码也能正常工作(假设它仍然是 3 的倍数)。这比:reshape(x,3,numel(x)/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
【讨论】: