如何在表的列中应用涉及元素的函数

时间:2013-08-06 00:58:26

标签: wolfram-mathematica dft

我有一个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这样的函数,但似乎它会通过输入行中每个元素的值直接应用我的函数,这不是我想要的。

2 个答案:

答案 0 :(得分:1)

我猜你的意思是你只想在一个列上映射一个函数?

mat = RandomInteger[{0, 10}, {5, 6}];
map[f_, mat_?(MatrixQ[#] &), c_Integer /; c > 0] := f /@ mat[[All, c]]

Mathematica graphics

map[f, mat, 2]

Mathematica graphics

答案 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]]

顺便说一句,有一个内置函数Fourierdocumentation here),它提供的DFT与你的DFT略有不同,但也很有用。我建议将来为这些任务寻找内置函数,因为Mathematica具有这样的广泛功能,可以为您节省很多麻烦。