我想将 matlab 中的每个布尔矩阵生成为 3 维数组。
例如:
mat(:,:,1) = [[1 0][0 1]]
mat(:,:,2) = [[1 1][0 1]]
...
我的最终目标是生成给定大小的每个三元矩阵。请记住,我知道矩阵的数量是指数的,但我会使用小数字。
不确定前面的答案是否确实符合您的要求...使用该方法,我在 array2D 中获得了多个相同的条目。这是一个矢量化且(我相信)正确的解决方案:
clear all;
nRows = 2;
nCols = nRows; % Only works for square matrices
% Generate matrix of all binary numbers that fit in nCols
max2Pow = nCols;
maxNum = 2 ^ max2Pow - 1;
allBinCols = bsxfun(@bitand, (0:maxNum)', 2.^((max2Pow-1):-1:0)) > 0;
% Get the indices of the rows in this matrix required for each output
% binary matrix
N = size(allBinCols, 1);
A = repmat({1:N}, nCols, 1);
[B{1:nCols}] = ndgrid(A{:});
rowInds = reshape(cat(3, B{:}), [], nCols)';
% Get the appropriate rows and reshape to a 3D array of right size
nMats = size(rowInds, 2);
binMats = reshape(allBinCols(rowInds(:), :)', nRows, nCols, nMats)
请注意,除了少数人之外,nRows
您将很快耗尽内存,因为您正在生成2^(nRows*nRows)
size 的矩阵nRows*nRows
。那是AlottaNumbers。
其实答案很简单。每个矩阵都是布尔值,可以通过以任何给定顺序读取所有值时获得的二进制数进行索引。
对于二进制矩阵:设 n 为矩阵中元素的数量(n = 行 * 列)。
for d=0:(2^n-1)
%Convert binary to decimal string
str = dec2bin(d);
%Convert string to array
array1D = str - '0';
array1D = [array1D zeros(1, n-length(array1D))];
%Reshape
array2D(:,:,d+1) = reshape(array1D, rows, cols);
end
通过将 dec2bin 更改为 dec2base 并将 2^n 更改为 (yourbase)^n,这可以很容易地推广到任何基础。