【请教】ArrayResample与Fourier的问题
mathematica吧
全部回复
仅看楼主
level 4
任道正 楼主
ArrayResample与Fourier这两个函数配合使用时,存在一个很奇怪的问题,代码如下:
ArrayResample[Fourier@RandomReal[{0, 1}, {4, 4}], Scaled[1/2]]
代码很简单,生成一个4*4的随机矩阵,然后对矩阵进行离散傅里叶变换,离散傅里叶变换之后再用ArrayResample抽样成2*2的矩阵,然而这行代码执行的结果为:
ArrayResample[{{2.47417 + 0. I, -0.109057 + 0.085872 I, -0.105956 +
0. I, -0.109057 - 0.085872 I}, {0.0693588 - 0.289296 I,
0.108197 + 0.00226999 I, 0.00873954 + 0.413119 I,
0.340223 - 0.405875 I}, {0.0085941 + 0. I, -0.419277 -
0.0741465 I, -0.267024 + 0. I, -0.419277 +
0.0741465 I}, {0.0693588 + 0.289296 I, 0.340223 + 0.405875 I,
0.00873954 - 0.413119 I, 0.108197 - 0.00226999 I}}, Scaled[1/2]]
也就是说ArrayResample函数根本没执行,我测试很多次,Fourier函数生成的复数矩阵,ArrayResample都会遇到此问题!然而如果用Table重新构造一个与Fourier生成的完全一样的复数矩阵,ArrayResample又能正常工作,请问下问题到底出在哪里?
2017年12月23日 04点12分 1
吧务
level 12
目测是ArrayResample的bug,与Fourier无关
比如
In[86]:= A = N@IdentityMatrix[4] + I;
ArrayResample[A, Scaled[1/2]]
ArrayResample[A, Scaled[1/2]] //
ToString[#, InputForm] & // ToExpression
Out[87]= ArrayResample[{{1. + 1. I, 0. + 1. I, 0. + 1. I,
0. + 1. I}, {0. + 1. I, 1. + 1. I, 0. + 1. I,
0. + 1. I}, {0. + 1. I, 0. + 1. I, 1. + 1. I,
0. + 1. I}, {0. + 1. I, 0. + 1. I, 0. + 1. I, 1. + 1. I}},
Scaled[1/2]]
Out[88]= {{1. + 1. I, 0. + 1. I, 0. + 1. I}, {0. + 1. I, 0.5 + 1. I,
0. + 1. I}, {0. + 1. I, 0. + 1. I, 1. + 1. I}}
建议向Wolfram官方反映一下
2017年12月23日 06点12分 4
吧务
level 13
似乎如果列表是PackedArray并含有虚数时,在计算需要产生新项时会无法处理
12/23/17 16:43:53 In[101]:= A = Fourier@RandomReal[{0, 1}, {4, 4}];
B = A /. 233 -> 0;
c = B // Developer`ToPackedArray;
d = c // Developer`FromPackedArray;
ArrayResample[A, Scaled[1/2]]
ArrayResample[B, Scaled[1/2]]
ArrayResample[c, Scaled[1/2]]
ArrayResample[d, Scaled[1/2]]
12/23/17 16:43:54 Out[105]= ArrayResample[{{1.9841 +
0. I, -0.263844 + 0.191388 I,
0.122302 + 0. I, -0.263844 - 0.191388 I}, {-0.386502 -
0.320247 I, -0.188588 + 0.200875 I,
0.00549514 + 0.182064 I, -0.220494 + 0.458365 I}, {-0.148452 +
0. I, 0.0333081 + 0.0340163 I, 0.514551 + 0. I,
0.0333081 - 0.0340163 I}, {-0.386502 + 0.320247 I, -0.220494 -
0.458365 I, 0.00549514 - 0.182064 I, -0.188588 - 0.200875 I}},
Scaled[1/2]]
12/23/17 16:43:54 Out[106]= {{1.9841 + 0. I, -0.0707706 +
0.0956939 I, -0.263844 - 0.191388 I}, {-0.267477 - 0.160123 I,
0.0911917 + 0.104239 I, -0.0935928 + 0.212174 I}, {-0.386502 +
0.320247 I, -0.107499 - 0.320214 I, -0.188588 - 0.200875 I}}
12/23/17 16:43:54 Out[107]= ArrayResample[{{1.9841 +
0. I, -0.263844 + 0.191388 I,
0.122302 + 0. I, -0.263844 - 0.191388 I}, {-0.386502 -
0.320247 I, -0.188588 + 0.200875 I,
0.00549514 + 0.182064 I, -0.220494 + 0.458365 I}, {-0.148452 +
0. I, 0.0333081 + 0.0340163 I, 0.514551 + 0. I,
0.0333081 - 0.0340163 I}, {-0.386502 + 0.320247 I, -0.220494 -
0.458365 I, 0.00549514 - 0.182064 I, -0.188588 - 0.200875 I}},
Scaled[1/2]]
12/23/17 16:43:54 Out[108]= {{1.9841 + 0. I, -0.0707706 +
0.0956939 I, -0.263844 - 0.191388 I}, {-0.267477 - 0.160123 I,
0.0911917 + 0.104239 I, -0.0935928 + 0.212174 I}, {-0.386502 +
0.320247 I, -0.107499 - 0.320214 I, -0.188588 - 0.200875 I}}
12/23/17 16:44:01 In[109]:= Developer`PackedArrayQ /@ {A, B, c, d}
12/23/17 16:44:01 Out[109]= {True, False, True, False}
12/23/17 16:44:02 In[110]:= ArrayResample[A, {2, 2}]
ArrayResample[A, {3, 3}]
12/23/17 16:44:02 Out[110]= {{1.9841 + 0. I, -0.263844 -
0.191388 I}, {-0.386502 + 0.320247 I, -0.188588 - 0.200875 I}}
12/23/17 16:44:02 Out[111]= ArrayResample[{{1.9841 +
0. I, -0.263844 + 0.191388 I,
0.122302 + 0. I, -0.263844 - 0.191388 I}, {-0.386502 -
0.320247 I, -0.188588 + 0.200875 I,
0.00549514 + 0.182064 I, -0.220494 + 0.458365 I}, {-0.148452 +
0. I, 0.0333081 + 0.0340163 I, 0.514551 + 0. I,
0.0333081 - 0.0340163 I}, {-0.386502 + 0.320247 I, -0.220494 -
0.458365 I, 0.00549514 - 0.182064 I, -0.188588 - 0.200875 I}}, {3,
3}]
2017年12月23日 08点12分 5
写完发现才相关帖子早已经被吧主挖出来了[笑眼]
2017年12月23日 09点12分
@隨意超 所以只要用Developer`FromPackedArray作用到傅里叶变换之后的矩阵就可以使ArrayResample正常工作了吗?
2017年12月23日 14点12分
2017年12月23日 15点12分
@隨意超 我那撑死也就是个提示啦。顺便受类似Bug困扰的函数其实不少……:https://mathematica.stackexchange.com/a/109812/1871
2018年01月06日 08点01分
1