如何将向量重塑为方阵?
How to reshape vector into sqare matrix?
我有一个特定大小的向量,我想将它重新整形为一个方阵。这是一个示例:假设向量的大小为 784。然后我将创建一个大小为 28x28 的矩阵。在 Matlab 中,我会使用以下命令来完成:
reshape(x,28,28)
当然也有可能没有精确的方阵。在这种情况下,矩阵应尽可能方形。
我该如何计算?这意味着我如何计算 reshape(x,a,b)
中的值 a
和 b
?
找到整数的最接近因子不是一个简单的问题。您需要使用 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
。
我有一个特定大小的向量,我想将它重新整形为一个方阵。这是一个示例:假设向量的大小为 784。然后我将创建一个大小为 28x28 的矩阵。在 Matlab 中,我会使用以下命令来完成:
reshape(x,28,28)
当然也有可能没有精确的方阵。在这种情况下,矩阵应尽可能方形。
我该如何计算?这意味着我如何计算 reshape(x,a,b)
中的值 a
和 b
?
找到整数的最接近因子不是一个简单的问题。您需要使用 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
。