我有一个n x m
数据矩阵。
如何创建一个包含每列元素的和的函数,这样如果我输入一个值,我会得到一个1 x m
行(其中m > 100
)?
更具体地说,我正在计算每列中数据的离散傅里叶变换,该变换应该适用于我输入的任何输入频率。
以下是我的单列代码:
(* Length of time data *)
n = Length[t]
(* Compute discrete fourier transform at specified frequency f *)
DFT[f_] := (t[[2]] - t[[1]]) Sum[
mat[[i + 1]] * Exp[2 Pi I f mat[[i + 1]]], {i, 0, n - 1}];
我想将其扩展到m列,这样如果我想以特定频率计算给定列的DFT
,我就可以提取1 x m
行的元素。
我考虑过像Map
这样的函数,但似乎它会通过输入行中每个元素的值直接应用我的函数,这不是我想要的。
答案 0 :(得分:1)
我猜你的意思是你只想在一个列上映射一个函数?
mat = RandomInteger[{0, 10}, {5, 6}];
map[f_, mat_?(MatrixQ[#] &), c_Integer /; c > 0] := f /@ mat[[All, c]]
map[f, mat, 2]
答案 1 :(得分:0)
看起来你只需要获得专栏。矩阵存储在Mathematica中的方式是第一个坐标为行,第二个坐标为列。所有坐标从1开始,而不是0.要在特定坐标处获取元素,请使用matrix[[row, column]]
。如果你想要整行,matrix[[row]]
。如果您想要一列matrix[[All, column]]
。因此,您可以通过以下方式调整DFT
函数:
DFT[f_, list_] := (t[[2]] - t[[1]]) Sum[
list[[i]] * Exp[2 Pi I f list[[i]]], {i, 1, n}];
yourColumnDFT = DFT[f, matrix[[All, columnNumber]]]
事实上,您可以通过删除对Sum
的调用来使这更简单,因为这些操作会自动按索引映射列表:
DFT[f_, list_] := (t[[2]] - t[[1]]) Total[list Exp[2 Pi I f list]]
顺便说一句,有一个内置函数Fourier
(documentation here),它提供的DFT与你的DFT略有不同,但也很有用。我建议将来为这些任务寻找内置函数,因为Mathematica具有这样的广泛功能,可以为您节省很多麻烦。