我有一个方形矩阵,我需要与fminsearch一起使用。矩阵的某些值需要是可变的,因为它们是我将与fminsearch一起使用的值,我需要在矩阵中保留它们的位置。例如,使用
X=[1,2,3;4,5,6;7,8,9];
我想做这个
p(1)=a1;
p(2)=a2;
p(3)=a3;
p(4)=a4;
X=[1, 2, a1 ; a2, 5, a3 ; 7, 8, a4];
这样我就可以在X上进行操作,创建一些用fminsearch最小化的东西。例如,假设我想找到a1,a2,a3和a4,以便在下面的代码中最小化C,它计算给定矩阵的总和熵:
Ent=zeros(size(X,1),1);
for k=1:size(X,2);
const=X(k,:);
logX=log(X(k,:));
logX=logX';
Ent(k,:)=const*logX;
end
Ent=-Ent;
C=sum(Ent);
这可以用MATLAB吗?假设我有一个带q参数的nxn矩阵,我如何调整这个想法以最小化相同的C?
编辑:
我想出了如何做我想做的事。然而,我发现梯度下降算法确实是一种更好的方法。我将发布一个我正在做的样本:
function test()
[new_param entropy]=fminsearch(@Cost,[3,3,3]);
function C=Cost(p)
X=rand(5);
X(1,1)=p(1);
X(2,2)=p(2);
X(3,3)=p(3);
Ent=zeros(size(X,1),1);
for k=1:size(X,2);
const=X(k,:);
logX=log(X(k,:));
logX=logX';
Ent(k,:)=const*logX;
end
Ent=-Ent;
C=sum(Ent);
end
X(1,1)=new_param(1);
X(2,2)=new_param(2);
X(3,3)=new_param(3);
X
new_param
entropy
end
答案 0 :(得分:1)
我认为你可以尝试这样的事情:
A = @(x) [1 2 x(1); 3 4 x(2); 5 6 x(3)];
或者,使用Symbolic Toolbox
:
syms x y z
A = [1 2 x; 3 4 y; 5 6 z];
答案 1 :(得分:0)
我可能会误解,但我认为这很简单:
X=[1, 2, p(1) ; p(2), 5, p(3) ; 7, 8, p(4)];
更新p
后,只需再次运行此语句即可获得所需的X
。