1

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

4

2 回答 2

1

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

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

数学图形

map[f, mat, 2]

数学图形

于 2013-08-06T07:22:00.633 回答
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此处的文档),它提供的 DFT 与您的稍有不同,但也很有用。我建议将来为这些任务寻找内置函数,因为 Mathematica 有很多这样的功能,会为你省去很多麻烦。

于 2013-08-08T19:27:31.433 回答