考虑[4x8]矩阵“A”和[1x8]矩阵“B”。我需要检查是否存在值“X”,以便
[A]^T * [X] = [B]^T exists for any x >= 0 { X is a [4X1] matrix, T = transpose }
现在这里是诡计/乏味的部分。矩阵A的对角线总是1。 A11,A22,A33,A44 = 1
这个矩阵可以被认为是两半,前半部分是前4列,后半部分是第二列,如下所示:
1 -1 -1 -1 1 0 0 1
A = -1 1 -1 0 0 1 0 0
-1 -1 1 0 1 0 0 0
-1 -1 -1 1 1 1 0 0
前半部分中的每一行都可以有两个或三个-1,如果它有两个-1,那么下半部分中相应的行应该有一个“1”,或者如果任何一行有三个-1,那么下半部分矩阵应该有两个1。总体目标是使每行的总和为0.
现在B是[1x8]矩阵,也可以认为是两半:
B = -1 -1 0 0 0 0 1 1
这里上半场可以有一个,两个,三个或四个-1,下半场应该有1个相同的数量。它应该在组合中完成例如,如果在前半部分中有两个-1,它们可以被放置在4个选择2 = 6种方式中,并且对于它们中的每一个,将有6种方式将1放置在后半部分中。共有6 * 6 = 36种方式。如果在上半场有两个-1,那么B的36个不同的值。在矩阵A中放置1也应该是相同的方式。我能想到这样做的方法是考虑valarray
或类似的东西并制作矩阵A和B,但我不知道该怎么做。
现在对于每一个A,我都要用B的每个组合测试它以查看是否存在
[A]^T * [X] = [B]^T
我试图证明我得到的结果我需要知道这样的X是否存在。我很难实现这一点。欢迎任何建议。这将属于数学中的线性规划概念。我想要它在C ++或Matlab中。任何其他语言也是可以接受的,但我只熟悉这两种语言。提前谢谢。
更新
以下是我对这个问题的回答:
clear;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%# Generating all possible values of vector B
%# permutations using dec2bin (start from 17 since it's the first solution)
vectorB = str2double(num2cell(dec2bin(17:255)));
%# changing the sign in the first half, then check that the total is zero
vectorB(:,1:4) = - vectorB(:,1:4);
vectorB = vectorB(sum(vectorB,2)==0,:);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%# generate all possible variation of first/second halves
z = -[0 1 1; 1 0 1; 1 1 0; 1 1 1]; n = -sum(z,2);
h1 = {
[ ones(4,1) z(:,1:3)] ;
[z(:,1:1) ones(4,1) z(:,2:3)] ;
[z(:,1:2) ones(4,1) z(:,3:3)] ;
[z(:,1:3) ones(4,1) ] ;
};
h2 = arrayfun(@(i) unique(perms([zeros(1,4-i) ones(1,i)]),'rows'), (1:2)', ...
'UniformOutput',false);
%'# generate all possible variations of complete rows
rows = cell(4,1);
for r=1:4
rows{r} = cell2mat( arrayfun( ...
@(i) [ repmat(h1{r}(i,:),size(h2{n(i)-1},1),1) h2{n(i)-1} ], ...
(1:size(h1{r},1))', 'UniformOutput',false) );
end
%'# generate all possible matrices (pick one row from each to form the matrix)
sz = cellfun(@(M)1:size(M,1), rows, 'UniformOutput',false);
[X1 X2 X3 X4] = ndgrid(sz{:});
matrices = cat(3, ...
rows{1}(X1(:),:), ...
rows{2}(X2(:),:), ...
rows{3}(X3(:),:), ...
rows{4}(X4(:),:) );
matrices = permute(matrices, [3 2 1]); %# 4-by-8-by-104976
A = matrices;
clear matrices X1 X2 X3 X4 rows h1 h2 sz z n r
options = optimset('LargeScale','off','Display','off');
for i = 1:size(A,3),
for j = 1:size(vectorB,1),
X = linprog([],[],[],A(:,:,i)',vectorB(j,:)');
if(size(X,1)>0) %# To check that it's not an empty matrix
if((size(find(X < 0),1)== 0)) %# to check the condition X>=0
if (A(:,:,i)'* X == (vectorB(j,:)'))
X
end
end
end
end
end
我是在stackoverflow人员的帮助下得到的。唯一的问题是linprog函数在每次迭代中抛出了很多异常以及产生的答案。例外是:
(1)Exiting due to infeasibility: an all-zero row in the constraint matrix does not have a zero in corresponding right-hand-side entry.
(2) Exiting: One or more of the residuals, duality gap, or total relative error has stalled: the primal appears to be infeasible (and the dual unbounded).(The dual residual < TolFun=1.00e-008.
这是什么意思。我怎么能克服这个?
答案 0 :(得分:0)
您的问题不清楚您是否熟悉system linear equations and their solution,或者您正在尝试“发明”。有关Matlab特定的解释,另请参阅here。
如果您熟悉这一点,那么您应该更清楚地了解问题的不同之处。