伪代码:
function IntNoise(32-bit integer: x)
x = (x<<13) ^ x;
return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);
end IntNoise function
我实现的代码:
function result=noise1(x)
newx=bitshift(x,13)
x1=newx.^x
temp1=x*(x*x*15731+789221)+1376312589
temp2=hex2dec('7fffffff');
vpa(temp2)
temp3=bitand(temp1,temp2)
result=1.0-temp3* 0.000000000931322574615478515625
问题很多:1.不管x输入多少,temp1值一样,为2^32,就是4294967295.
2.既然matlab最大只支持32位,为何a=vpa(4^64,100)却能输出大于2^32的值。
3.就是上面的那个函数,用1减是什么意思,我感觉后面那个结果也可能大于1的啊?
4.我用plot画函数图象(我这样写的,x=1:5,plot(x,noise1(x)),noise1是调用上面的函数),人家总提示什么mtimes错误,在temp1那行。我没仔细学matlab,都是遇到什么看什么,可能理解不深刻。
问题很多,我百度了一上午,现在干脆求救一下,下午再继续百度。
柏林噪声函数通过matlab实现并画出图像问题。
答案:2 悬赏:50 手机版
解决时间 2021-02-01 10:06
- 提问者网友:人傍凄凉立暮秋
- 2021-01-31 21:58
最佳答案
- 五星知识达人网友:拜訪者
- 2021-01-31 22:10
1、“不管x输入多少,temp1值一样,为2^32,就是4294967295”
不对啊,我随便试着输入x=3和5,得到的temp1分别为1379104989和1382225069;
2、“既然matlab最大只支持32位,为何a=vpa(4^64,100)却能输出大于2^32的值”
首先,MATLAB最大不是支持32位,至少整形数支持64位的(int64和uint64);
其次,默认输入的数是双精度浮点数,其数值范围大约在-1.7E308至1.7E308之间,但有效数字的位数仅为二进制52位;
第三,vpa使用符号数学工具箱,可实现任意精度的计算;
第四,你使用vpa(4^64,100)可以输出大于2^32的数,而且是精确的,但用vpa(3^64,100)则不能实现精确输出(可以使用vpa(sym(3)^95,100)做到)。
3、这一条和你的算法有关,我还没仔细研究;
4、你调用noise1(x)的参数x是向量,用到x的地方应该使用点运算,例如:
temp1=x.*(x.*x.*15731+789221)+1376312589
不对啊,我随便试着输入x=3和5,得到的temp1分别为1379104989和1382225069;
2、“既然matlab最大只支持32位,为何a=vpa(4^64,100)却能输出大于2^32的值”
首先,MATLAB最大不是支持32位,至少整形数支持64位的(int64和uint64);
其次,默认输入的数是双精度浮点数,其数值范围大约在-1.7E308至1.7E308之间,但有效数字的位数仅为二进制52位;
第三,vpa使用符号数学工具箱,可实现任意精度的计算;
第四,你使用vpa(4^64,100)可以输出大于2^32的数,而且是精确的,但用vpa(3^64,100)则不能实现精确输出(可以使用vpa(sym(3)^95,100)做到)。
3、这一条和你的算法有关,我还没仔细研究;
4、你调用noise1(x)的参数x是向量,用到x的地方应该使用点运算,例如:
temp1=x.*(x.*x.*15731+789221)+1376312589
全部回答
- 1楼网友:人類模型
- 2021-01-31 22:53
i = imread('eight.tif');
j1 = imnoise(i,'salt & pepper',0.1); %椒盐
j2 = imnoise(i,'gaussian',0,10) %gauss
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯