在Mathematica中将坐标系转换为Matrix

500*_*500 6 wolfram-mathematica transform count matrix coordinates

在编程问题之前,我认为我需要给出一些我正在做的事情的背景知识,以便于理解我的问题:

我在向受试者主体显示一些图案的同时记录眼球运动.通过实验,我后来展示了这些模式的一些对称变换.

在此输入图像描述

我得到的是固定坐标和持续时间列表:

{{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}} *)
Run Code Online (Sandbox Code Playgroud)

以下是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]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我想做的事 :

我想将刺激框架空间"离散化"成簇:

以下是具有不同聚类(2,4,16,64)的视觉表示(在PPT中完成).

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

在此输入图像描述

有了这个,我想

- 计算每个群集中的注视数量.

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

矩阵形式可以让我轻松地通过减法比较不同的显示器固定.

所以,问题

- 我如何创建一个灵活的机制来将刺激框架分成簇.

- 将固定点映射到那些簇上,获得填充0或固定点数的矩形矩阵或每个矩阵单元的总固定持续时间.

我觉得这个问题可能不清楚,并会编辑它以澄清所需的一切.另外,你认为这应该在2个单独的问题中提出,我很乐意这样做.

非常感谢您提供的任何帮助.

Dr.*_*ius 8

你可以这样做:

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]]);]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果你想加上固定时间

cm = createMatrix[fix, FrameXYs, 10, 10, # &]
MatrixPlot@cm
MatrixForm@cm
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑

在索引中进行一些调整,一点点代码修饰,一个更清晰的例子:

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]]);]
Run Code Online (Sandbox Code Playgroud)

.

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]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述