【发布时间】:2020-01-14 02:25:39
【问题描述】:
我设置了2个问题如下:
我有两个矩阵(Mat1 和 Mat2)。两个矩阵大小相等。我有四个输出矩阵(分别是Output1、Output2、Output3、Output4),它们的大小都与Mat1 和Mat2 相同。
问题一:
在 Mat2 中,标识 column1 中包含最大值的行。让我们假设这是第 1 行。
转到 Mat1 的第 1 行,提取 Mat1 第 1 行的前 3 列并存储在 Output1 中。将前 3 列的所有其他行存储在 Mat2 中。在这个阶段 Output1 是 1x3。输出 2 为 (n-1)x3。
移至 Mat2 的第 4 列。识别包含最大值的行。假设这是第 5 行。
-
转到 Mat1 第 4 列的第 5 行。将第 5 行的第 4、5、6 列存储在 Output1 中。将 Mat1 的所有其他行存储在 Output2 中的第 4、5、6 列。 ... 对 Mat2 中的所有列重复此过程,顺序为:1、4、7、9 等。在这种情况下,我有 25 列用于 Mat1 和 Mat2,因此序列将在 24 处结束。
我需要能够将序列从 1、4、7、9 等更改为 1、13、25 等。
问题2: 等效于问题 1,除了这次我确定每个阶段中包含前两个值的行。
在 Mat2 中,确定包含 Column1 中前两个值的行。假设这些行是 2 和 5。将 Mat1 的第 2 行和第 5 行的前 3 列存储在 Output3 中。将 Mat1 的所有剩余行(第 1-3 列)存储在 Output4 中。
移至 Mat2 的第 4 列。确定包含 Mat2 的第 4 列中前两个值的行。假设第 1 行和第 2 行。
移动到垫子 1 的第 4 列。将第 4、5、6 列存储到第 1 行和第 2 行到输出 3。将所有剩余行存储在 Output4 中。
旁注:对于 1000x1000 尺寸的矩阵,必须轻松扩展此过程。所以不希望手动执行此操作。
Mat1 <- data.frame(matrix(nrow = 10, ncol =25, data = rnorm(250,0,1)))
Mat2 <- data.frame(matrix(nrow = 10, ncol =25, data = rnorm(250,0,1)))
> Mat1
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13
1 -2.22415466 0.98712728 1.0084356 0.58447183 0.2608830 -0.341029099 -0.71693894 -0.61653058 -0.24790470 0.10777970 -1.68562271 -1.6638535 -0.5538468
2 1.11444365 -0.34865955 0.7518822 -0.07573724 0.1336811 -0.831275643 -0.15564822 -0.68849375 -0.05094047 0.21990082 -0.69879135 -0.6348292 1.0172304
3 -0.05367747 0.08654206 -0.3023270 -0.67335942 -1.1173279 0.004670625 0.52482501 0.78330982 1.18795853 -0.06513613 0.42353439 -0.4152209 1.7174158
4 0.42118984 -0.43257583 -1.3368036 1.64849798 0.8294276 1.256987496 -0.50440892 1.07686292 0.94196135 2.90916270 -0.08714083 0.1094395 1.1715895
5 -0.13720451 -0.94864452 1.9751962 -0.70523555 0.1431405 0.569928767 0.54877505 -0.44571903 -1.16282161 -1.65590032 -0.17710859 -0.8904316 0.3252576
6 0.64336424 -0.38277541 -1.6512377 -0.06542054 -0.1195322 0.666255832 0.60826054 1.88822842 -0.52952627 -0.44776682 0.04321836 -0.6190585 -0.9529690
7 -1.04160098 1.10952094 -0.9186759 0.77437293 -0.2284926 -0.113106151 -0.32092624 1.34157301 2.33813068 1.21812714 0.13165646 0.5532299 -1.3470645
8 1.22940987 -1.26271164 -1.2483658 -2.00578793 -0.6773794 -0.228135998 -0.06223206 -1.97606848 1.67339247 -0.47268196 -0.83544561 -0.3313278 -0.2373613
9 0.08485706 -1.60594589 0.8549923 -0.23394708 -0.5978692 -0.321839877 -0.55298452 -0.08387815 -0.99196489 0.83364114 -0.19579612 -0.8017648 -0.2238073
10 -1.71702699 0.39086484 -0.9974210 0.86232862 -0.2755329 -0.160656438 0.49669949 0.73763073 -0.42380390 1.91208332 -0.27778479 0.7866471 0.1813511
> Mat2
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13
1 0.11053732 -0.5750170 2.58105259 -1.6895285 0.0508918 -0.54188929 -0.92292169 1.4972970 0.009239807 -0.1706461 -0.8942262 -1.6351505 0.2029262
2 -0.83802776 -0.9322157 -0.34753884 0.8164819 0.7318198 0.09162218 0.15971493 -2.6731067 1.554323641 -0.3161967 0.4622101 -1.9521229 -1.3229961
3 0.61368153 -1.3650360 0.95674229 0.4582117 -0.6959545 -0.59627428 1.94172156 1.6784237 -0.482524695 -0.0514944 -0.4608930 -0.5456863 -0.1340540
4 -1.03156503 -0.2516495 0.76770177 -0.7841354 -3.2404904 -1.76276859 1.57421914 0.9782458 -1.364451438 -0.6437429 0.7485424 -0.8778284 1.7587504
5 0.01183232 0.6825633 1.39634308 1.4136879 0.5166420 0.76930390 0.67210932 1.3007904 -0.284451411 0.5163457 0.3198626 0.8030497 -1.4320064
6 -0.06110883 -0.6762991 0.56105196 0.9767543 -1.0016294 -0.84811626 -0.83319744 -1.1777865 -1.185631394 -0.5673733 0.2956725 0.5425602 -1.0510479
7 -0.56195630 1.3883881 0.09995573 0.6722959 -1.6205290 0.32085867 -0.94243554 -0.2340429 -1.299085265 -0.4433517 0.4424583 -2.8887970 0.1679859
8 1.04612102 0.8360530 0.07005306 0.4818317 1.1857504 0.13649605 1.35261983 0.8008935 -0.101922164 0.6773003 -1.0265770 0.1859912 0.2678461
9 0.88419676 -1.7012899 -1.09656000 -0.4360276 0.6238451 -2.03256276 -1.12575579 1.8407234 0.522372401 -0.6229582 0.6727720 -0.5695190 0.6298388
10 -0.68648649 -0.6689894 -0.56849261 -1.9012760 1.1418180 0.46377789 -0.08107475 1.4378120 -1.489367198 -0.7682887 -0.2858680 0.9584056 1.3178700
例如:
which.max(Mat2[,1]) # 8
所以转到Mat1 的第8 行并将前3 列存储在Output1 中。
Output1[1, 1:3] # 1.22940987 -1.26271164 -1.2483658
将所有其他行的Mat1 存储在Output2 中的列1 到3。
which.max(Mat2[, 4]) # 5
暗示
Output1[1, 4:6] # -0.70523555 0.1431405 0.569928767
等等等等。
【问题讨论】:
-
你确定 Mat1 和 Mat2 应该是这样的吗?它必须是 data.frame 还是应该是矩阵?
-
@RonakShah 已调整。这就是我的意思。
-
@RobinGertenbach 它应该是一个data.frame。我不确定如何以一种好的方式创建可重现的示例。
-
这已经有所帮助,理想情况下,在使用 rnorm 时,您可以设置种子,这样我们就可以获得相同的数字。 rnorm 应该是 2500 个元素还是 250 个?
-
@RobinGertenbach 它只是用来填充矩阵。数据不重要