如何将向量重塑为方阵?

How to reshape vector into sqare matrix?

我有一个特定大小的向量,我想将它重新整形为一个方阵。这是一个示例:假设向量的大小为 784。然后我将创建一个大小为 28x28 的矩阵。在 Matlab 中,我会使用以下命令来完成:

reshape(x,28,28)

当然也有可能没有精确的方阵。在这种情况下,矩阵应尽可能方形。

我该如何计算?这意味着我如何计算 reshape(x,a,b) 中的值 ab?

找到整数的最接近因子不是一个简单的问题。您需要使用 MATLAB 对问题 Input an integer, find the two closest integers which, when multiplied, equal the input 的回答。从那个问题如果你使用提供函数findIntegerFactorsCloseToSquarRoot的答案,你可以使用下面的代码来重塑。

[a, b] =  findIntegerFactorsCloseToSquarRoot(numel(x));
reshape(x, a, b);

a 开始等于 numel(x) 的平方根向下舍入。如果该数字不能整除 numel(x),请减去 1,然后重试。这样一来,您的 a 等于最接近除 numel(x)sqrt(x)(从下)的整数。 b 将是 numel(x)/a,但您可以简单地使用 [] 作为 reshape 的第三个参数:

a = floor(sqrt(numel(x)));
while mod(x,a)
    a = a-1;
end
result = reshape(x,a,[]);

示例:

x = 1:20;

给予

result =
     1     5     9    13    17
     2     6    10    14    18
     3     7    11    15    19
     4     8    12    16    20

一种可能的方法:

x = rand(1, 784);
divisors = find(rem(numel(x), 1:numel(x)) == 0);
[~, idx] = min(abs(divisors - sqrt(numel(x))));
x = reshape(x, divisors(idx), numel(x) / divisors(idx));

让我解释一下:

假设您有一个名为 x:

的向量
x = rand(1, 784);

首先,求 x 大小的约数:

divisors = find(rem(numel(x), 1:numel(x)) == 0);

然后,您继续选择最接近 x 大小的平方根的除数:

[~, idx] = min(abs(divisors - sqrt(numel(x))));

最后,您使用该除数(和相应的倍数)重塑 x

x = reshape(x, divisors(idx), numel(x) / divisors(idx));

我建议你先通过isprime(784)检查这个数是否是素数。

然后你可以使用prime_factors = factor(784)来得到数字的整数因式分解。 (根据您可能使用的 MATLAB 版本 ifactor(784)

剩下的 prime_factors