为了更好地解释我的需要,这是我的第一个代码:
function allpos = f1(x)
allpos=reshape(permute((dec2base(0:power(2,x*x)-1,2)-'0'),[3 2 1]),x,x,[]);
这段代码完全符合我的需要。如果用户输入f1(2)
,则会返回从[0 0; 0 0]
到[1 1; 1 1]
的每个矩阵。但是,它也给了我很多无用的矩阵。我只想要在对角线上镜像的矩阵,对角线上只有零。
更简单地说,对于f1(3)
,我只想要
[0 0 0; 0 0 0; 0 0 0]
到[0 1 1; 1 0 1; 1 1 0]
。这意味着如果我运行新的f1(3)
;它将返回8个矩阵,而不是512.
如何重写函数来执行此操作?我知道它需要某种类型的三角形矩阵和它的转换自我,但我不能把它拼凑在一起。谢谢!
答案 0 :(得分:0)
它可能会更简洁,但以下是您所要求的。
function allpos = f1(x)
N = (x-1)*x / 2;
z = permute(dec2base(0:power(2,N)-1,2)-'0',[3 2 1]);
allpos = zeros(x,x,power(2,N));
idx = repmat(logical(tril(ones(x),-1)),[1,1,power(2,N)]);
allpos(idx) = z(:);
allpos = permute(allpos,[2 1 3]);
allpos(idx) = z(:);
答案 1 :(得分:0)
@ jodag的类似解决方案,但更简洁......
function allops=f1(x)
allops=zeros(x,x,2^(sum(1:x-1)));
allops(find(triu(ones(x),1))+x^2*(0:2^(sum(1:x-1))-1))=[dec2base(0:2^(sum(1:x-1))-1,2)-'0'].';
allops=allops+permute(allops,[2 1 3])
end