How can I calculate fzero from values of matrices in cell array?
1 次查看(过去 30 天)
显示 更早的评论
Dear All, I have three cell arrays: cv_o, std_m and mean_m. Both cells contains 359 2D matrices. The size of matrices is same. I would like to calculate the root of an equation using the values of these matrices. I tried to calculate fzero by the following way:
for jj=1:359;
for i=1:464;
for j=1:201;
mat(i,j)=cv_o{jj};
mstd(i,j)=std_m{jj};
mmean(i,j)=mean_m{jj};
if mat(i,j) == 0;
b(i,j) = 0;
else
b(i,j)=fzero(@(x)mat(i,j)-(mstd(i,j)./mmean(i,j)).^x,(0));
end
end
end
end
But I got the following error message: Subscripted assignment dimension mismatch. Could someone write me how I should solve calculate the root?
0 个评论
采纳的回答
Michael Haderlein
2015-4-20
编辑:Michael Haderlein
2015-4-20
Dear Beáta,
Check this line (same holds for the next two lines):
mat(i,j)=cv_o{jj};
As you said, cv_o{jj} will return a matrix; but mat(i,j) is one scalar value and this mismatch is causing the error. Given that varname(i,j) returns a scalar, you'll see that also your equation can be solved analytically: x=log(mat(i,j))/log(mstd(i,j)/mmean(i,j)) I guess you want to have matrix operations here, but right now it's all scalar. Possibly you just need to remove all those (i,j), but I cannot say that for sure. Also, you'll not get b(i,j) but rather b(jj).
2 个评论
Michael Haderlein
2015-4-21
To keep the thread readable, I copy-paste your post here. Please also answer as comment here. The sequence of answers might change and the thread will be confusing then.
Answer by Szabó-Takács Beáta:
Dear Michael, Thank you for your help! I changed the calculation according to your suggestion by the following way:
for jj=1:360;
for i=1:464;
for j=1:201;
mat=cv_o{jj};
mstd=std_m{jj};
mmean=mean_m{jj};
if mat(i,j) == 0;
b(i,j)=0;
elseif mat(i,j) > 0;
b(i,j)=fzero(@(x)mat(i,j)-(mstd(i,j)./mmean(i,j)).^x,(0.1));
BB{jj}=b;
end
end
end
end
It calculates the power b until jj=29. After that I got the following message: Error using fzero (line 309) Function value at starting guess must be finite and real. I do not understand why? I checked the values of cv_o. It does not contain NaN or Inf values. And I am not sure that values of b are right. I had tried calculate the function without using i, j but as you suggested but it did not create b(jj). Could you write me what the matter is?
=========== my response ==============
I had another look on your function, why do you actually use fzero at all? You are using element-wise operators (with dot), so my analytical solution from the above answer holds, too. You can simplify your code to
for jj=1:360;
mat=cv_o{jj};
mstd=std_m{jj};
mmean=mean_m{jj};
BB{jj}=log(mat)./log(mstd./mmean);
BB{jj}(mat==0)=0;
end
In principle, by using cellfun you could even cut it down to a one-liner without any loop (I was using rand values for cv_o, std_m, mean_m; also please note the transpose operator needed to show equality):
>>PP=cellfun(@(x,y,z) log(x)./log(y./z), cv_o, std_m, mean_m,'uniform',false);
>> isequal(PP',BB)
ans =
1
With respect to the error message, maybe mmean is zero somewhere. Then your function is inf (or NaN if the same mstd is also zero) and causes the error.
更多回答(1 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Function Creation 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!