gpt4 book ai didi

matrix - 在Mathematica中将坐标系转换为矩阵

转载 作者:行者123 更新时间:2023-12-04 13:24:36 26 4
gpt4 key购买 nike

在提出编程问题之前,我相信我需要简要介绍一下我正在做些什么,以简化对我的问题的理解:

我记录眼动的同时向被摄对象显示一些模式。通过实验,我稍后展示了这些模式的一些对称变换。

我得到的是注视点坐标和持续时间的列表:

{{fix1X,fix1Y,fix1Dn},{fix2X,fix2Y,fix2Dn},... {fixNX,fixNY,fixNDn}}

在哪里 :

- fix1X 是第一个注视的X坐标。

- fix1Y 是第一个注视的Y坐标。

- fix1D 是注视的持续时间(以毫秒为单位)

请考虑:

FrameWidth  = 31.36;
scrHeightCM = 30;
scrWidthCM = 40;
FrameXYs = {{4.32, 3.23}, {35.68, 26.75}}; (* {{Xmin,Ymin},{Xmax,Ymax}} *)

以下是1个显示器的注视(屏幕上3s刺激演示期间的主题注视)
fix ={{20.14, 15.22, 774.}, {20.26, 15.37, 518.}, {25.65, 16.22, 200.}, 
{28.15, 11.06, 176.}, {25.25, 13.38, 154.}, {24.78, 15.74, 161.},
{24.23, 16.58, 121.}, {20.06, 13.22, 124.}, {24.91, 15.8, 273.},
{24.32, 12.83, 119.}, {20.06, 12.14, 366.}, {25.64, 18.22, 236.},
{24.37, 19.2, 177.}, {21.02, 16.4, 217.}, {20.63, 15.75,406.}}

Graphics[{
Gray, EdgeForm[Thick],
Rectangle @@ {{0, 0}, {scrWidthCM, scrHeightCM}},
White,
Rectangle @@ StimuliFrameCoordinates,
Dashed, Black,
Line[
{{(scrWidthCM/2), FrameXYs[[1, 2]]},
{(scrWidthCM/2), FrameXYs[[2, 2]]}}],
Line[
{{FrameXYs[[1, 1]], (scrHeightCM/2)},
{(FrameXYs[[2, 1]]), (scrHeightCM/2)}}],

Thickness[0.005], Pink,
Disk[{#[[1]], #[[2]]}, 9 N[#[[3]]/Total[fix[[All, 3]]]]] & /@ fix
}, ImageSize -> 500]

我想做什么:

我想将刺激框架空间“离散化”为簇:

以下是具有不同群集(2,4,16,64)的可视化表示(在PPT中完成)。

彩色部分代表发生固定的簇:

为此,我要

-计算每个群集内的注视点数量。

-计算每个群集中观察到的存在/计数或持续时间。

矩阵形式很容易使我能够通过减法比较不同的显示器注视。

因此,问题

-如何创建一种灵活的机制将刺激框架分为几类。

-将注视点映射到这些簇上,以获得一个矩形矩阵,矩阵中填充了0或注视点计数或每个矩阵单元的总注视持续时间。

我觉得这个问题可能不清楚,将对其进行编辑以阐明所需的内容。
另外,您认为应该在两个单独的问题中提出这个问题吗,我很高兴这样做。

在此先感谢您能提供的任何帮助。

最佳答案

您可以执行以下操作:

createMatrix[list_, frameXYs_, partitX_, partitY_, fun_] :=
Module[{matrix},
(*init return matrix*)
matrix = Array[0 &, {partitX, partitY}];
(matrix[[
IntegerPart@Rescale[#[[1]], {frameXYs[[1, 1]], frameXYs[[2, 1]]}, {1,partitX}],
IntegerPart@Rescale[#[[2]], {frameXYs[[1, 2]], frameXYs[[2, 2]]}, {1,partitY}]
]] += fun[#[[3]]]) & /@ list;

Return@(matrix[[1 ;; -2, 1 ;; -2]]);]

其中 fun是列表第三维上的计数函数。

因此,如果您要计算出现次数:
fix = {{20.14, 15.22, 774.}, {20.26, 15.37, 518.}, {25.65, 16.22, 200.}, 
{28.15, 11.06, 176.}, {25.25, 13.38, 154.}, {24.78, 15.74, 161.},
{24.23, 16.58, 121.}, {20.06, 13.22, 124.}, {24.91, 15.8, 273.},
{24.32, 12.83, 119.}, {20.06, 12.14, 366.}, {25.64, 18.22, 236.},
{24.37, 19.2, 177.}, {21.02, 16.4, 217.}, {20.63, 15.75, 406.}};
FrameXYs = {{4.32, 3.23}, {35.68, 26.75}};

cm = createMatrix[fix, FrameXYs, 10, 10, 1 &]
MatrixPlot@cm
MatrixForm@cm

如果您想增加注视时间
cm = createMatrix[fix, FrameXYs, 10, 10, # &]
MatrixPlot@cm
MatrixForm@cm

编辑

在索引中进行一些调整,添加一些代码修饰,这是一个更清晰的示例:
createMatrix[list_, frameXYs_, partit : {partitX_, partitY_}, fun_] :=
Module[{matrix, g},
(*Define rescale function*)
g[i_, l_] := IntegerPart@
Rescale[l[[i]], (Transpose@frameXYs)[[i]], {1, partit[[i]]}];
(*Init return matrix*)
matrix = Array[0 &, {partitX + 1, partitY + 1}];
(matrix[[g[1, #], g[2, #]]] += fun[#[[3]]]) & /@ list;
Return@(matrix[[1 ;; -2, 1 ;; -2]]);]


fix = {{1, 1, 1}, {1, 3, 2}, {3, 1, 3}, {3, 3, 4}, {2, 2, 10}};
FrameXYs = {{1, 1}, {3, 3}};
cm = createMatrix[fix, FrameXYs, {7, 7}, # &];
MatrixPlot@cm
Print[MatrixForm@SparseArray[(#[[1 ;; 2]] -> #[[3]]) & /@ fix], MatrixForm@cm]

关于matrix - 在Mathematica中将坐标系转换为矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7132584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com