MATLAB code 求助【已解决】

不知道该发那个版, 版主对不起了, 借女生版的地一用。

感谢各位同学帮忙, 问题已解决。


还是把CODE COPY 上来吧, 主要是想写个求aperture的code, 先是计算从中心往外每增加一点半径,flux的变化。 这步做到了(以下的aper.m 和 main.m)。
然后第二部是计算signal to noise ration (SNR), 这里卡住了, 因为我的公式里需要object 和 background的 flux, 这2个数都在aper.m里定义的, 现在我想再用在求SNR里, 它就说我没定义这两个数了。

—aper.m------
function apt_pix = aper(im,x0,y0,r_ap,is,os)

image = fitsread (im);
delta = 50;
x = x0-delta: x0+ delta;
y = y0-delta: y0+ delta;
sec_star = image (y,x);
figure(2);
imshow (sec_star, [0, 2000]);
[X, Y] = meshgrid (x, y);
dist = sqrt ((x0-X).^2 + (y0-Y).^2);
star = sec_star(dist < r_ap);
ring = dist > is & dist <os;
background = sec_star (ring);
background_median = median(background);
star_real = star - background_median;
apt_pix = sum (star_real (: ));

end

—main.m----
im= ‘mh170110.fit’;
x0 = 889;
y0 = 594;
is = 25;
os = 30;

r_ap =[5:1:30];
n_ap = length(r_ap);
res = zeros(n_ap);

for i = 1:n_ap;
res(i) = aper(im,x0,y0,r_ap(i),is,os);
mag(i)=25 -2.5*log10(res(i));
end

—需要加入的SNR 公式—
g=0.73;
ron=3.3;
n_pix = length(star_real);
N_OBJ = res(i); %N_OBJ 就是object的number count
N_SKY = background_median; %N_SKY 就是背景的number count

SN=(gN_OBJ)/sqrt(gN_OBJ + n_pixgN_SKY + n_pix*ron^2);

然后我现在就是不知道怎么把sn 加进去。 加入到main.m里, 它说我的background 没有定义。 下面有同学提醒了, 因为background只在aper方程里面设置了所以方程以外不能用。 不知道我是不是应该在aper.m里定义一个 sub-function, 叫它snr 什么的, 然后再在main.m里面call snr?

我知道这些都是很基础, 因为我之前用别的编程, 现在刚学matlab, 经常脑子转不过来。


我matlab初学,菜鸟一个,想请问一下懂matlab的学霸们, 如果我建立了一个 test.m 的function文件, 比方说(以下符号都是打个例子而已):
function y = test (a)
b = 2a;
c=3+a;
d=b+c;
y = c+d^2;
end

然后如果我给出a的值, 根据设立的function就可以求出y的值。 我现在想在另一个file 里面(比方说, 新开一个叫main.m的文件), 求, 比如说,P=y+1的值, 只需要在程序里面给出a值,call for function ‘test’ 就可以了。 这一步做到了。 但是我想在同一个main.m的文件里再求另一个叫Q的, Q=y+b, 现在程序一直说 'Undefined function or variable ‘b’.

我怎么才能在main.m 里用b 值啊?因为我的main.m里只是call 了test方程, 怎么把整个test的变数都拉过来用啊?

:cn03: :cn03:

你的b是定义在你的test方法的scope里,所以不能在scope外用。你要么定义一个新的function testb(a) 然后把test 方法里计算copy 进去,最后return y+b.

或者你就call test(a) + 2a

这样啊, 谢谢 :cn03: 主要是我在这里简单化了, 但是我实际上的code里的 ‘b’ 是一个由好几个其他变数得出来的量, 如果从新写的话就是得把这些全部都在新function里再写一次咯? 哭~

b是function里面的local variable,在function外面是看不见的。

一个解决办法是把b定义为global varianle。在function里面在function以后的第一行加global b,然后在main的最前面也加global b这行。

另外一个办法把b定义为function的另外一个输出变量。

function [b, y]=test(a)

当然在main里面用test也得这样双输出变量方式。

我试过用GLOBAL了, 不行, 但是我也不知道哪里错了。。。 因为我MATLAB知识太菜了,出了错也不知道怎么改正,但是整个CODE写上来又太长了。。。

我不想改TEST的输出, 因为我建立TEST这个方程是为了MAIN 里面一段方程里使用TEST方程的, 如果改了它的输出, 我前面那段可能不工作了,到时候我又不知道怎么改 :cn03:

我现在想尝试在TEST 里面建立一个SUB方程求我第二个目标, 不知道行不行?还在琢磨中。。。

大哥连这个都懂?!

你定义了y值,但是新的function里没定义b值啊

大哥连matlab都懂,又一次膜拜

function的输出不要写xyz,output就写output或者类似的,以免和const var混淆引起误解

说这么多不如把code放上来,几秒钟的事

global声明要在第一次使用b前面,另外function和main里面都要有。

当年还是6.5或者7的版本。现在啥版本啊

apt_pix变三输出fucntion output,最后output = [apt_pix, background_median, star_real];

扔在res(i)那个for里,比如bg_median(i)或者st_real(i),for把里面的轮一遍之后就随便你用了

谢谢! 试试去!

太感谢了, work了。

我根据你说的改动了一下下, 把function的output从本来的 ‘apt_pix’ 改成 ’[apt_pix, SN] = aper (…)’ , 然后像你说的,就在那个main.m的for-loop 里call function时候改成 ‘[res(i) SN(i)] = aper(im,x0,y0,r_ap(i),is,os);’

谢谢啊~

现在放上来了, 请看首页更新,谢谢了。

靠,工科人多少都知道点这个东西啊。

工科男

现在8.5。你从6.5开始说明你很年轻。

好我试试, 谢谢