这个问题与我之前在这里提出的类似。我再次有一个非常大的矩阵,行和列名称相同。这些名称由三个字母的字符串后跟一个数字组成。三个字母的字符串重复出现,只有数字发生变化。经过几次重复之后,字符串更改并且数字从1开始。
基本上,我要根据每个元素的行名称和列名称进行具体计算。
下面是一个示例矩阵
对于这个矩阵的每个元素,我想要进行乘法运算。用语言描述有些困难。
如果矩阵的一个元素的行名称与其列名称的三个字母字符串不同,我将匹配出现在该字符串后面的数字,并将“第一个三个字母字符串的数字”乘以“第二个三个字母字符串与相同数字”。
如果匹配
或者基本上是元素的平方。
下面我将举一些例子,说明我的要求:
- 在矩阵
最终,矩阵(称为d)应该如下所示:
有没有一种循环或其他方式可以更有效地解决这个问题的代码?
基本上,我要根据每个元素的行名称和列名称进行具体计算。
下面是一个示例矩阵
a
:matrix <- matrix(c(1:36), nrow = 6, byrow = TRUE)
names <- paste(rep(c("aaa" , "bbb", "ccc"), each = 2) , rep(c(1:2) , times = 3))
rownames(matrix) <- names
colnames(matrix) <- names
that gives:
aaa 1 aaa 2 bbb 1 bbb 2 ccc 1 ccc 2
aaa 1 1 2 3 4 5 6
aaa 2 7 8 9 10 11 12
bbb 1 13 14 15 16 17 18
bbb 2 19 20 21 22 23 24
ccc 1 25 26 27 28 29 30
ccc 2 31 32 33 34 35 36
对于这个矩阵的每个元素,我想要进行乘法运算。用语言描述有些困难。
如果矩阵的一个元素的行名称与其列名称的三个字母字符串不同,我将匹配出现在该字符串后面的数字,并将“第一个三个字母字符串的数字”乘以“第二个三个字母字符串与相同数字”。
如果匹配
"aaa"
与 "bbb"
,则:matrix[aaa (number n), aaa (number m)] * matrix[bbb (number n), bbb (number m)]
如果"aaa"
等于"aaa"
,那么
matrix[aaa (number n), aaa (number m)] * matrix[aaa (number n), aaa (number m)]
或者基本上是元素的平方。
下面我将举一些例子,说明我的要求:
- 在矩阵
matrix["aaa 1", "aaa 2"]
中,我会将matrix["aaa 1", "aaa 2"]
乘以matrix["aaa 1", "aaa 2"]
(2*2),得到4。
- 在矩阵matrix["aaa 1", "bbb 2"]
中,我会将matrix["aaa 1", "aaa 2"]
乘以matrix["bbb 1", "bbb 2"]
(2*16),得到32。
- 在矩阵matrix["bbb 2", "ccc 1"]
中,我会将matrix["bbb 2", "bbb 1"]
乘以matrix["ccc 2", "ccc 1"]
(21*35),得到735。最终,矩阵(称为d)应该如下所示:
aaa 1 aaa 2 bbb 1 bbb 2 ccc 1 ccc 2
aaa 1 1 4 15 32 29 60
aaa 2 49 64 147 176 245 288
bbb 1 15 32 225 256 435 480
bbb 2 147 176 441 484 735 792
ccc 1 29 60 435 480 841 900
ccc 2 245 288 735 792 1225 1296
我用一些糟糕的代码得到了它:
d <- matrix^2
d[1,3] <- matrix[1,1] * matrix[3,3]
d[1,4] <- matrix[1,2] * matrix[3,4]
d[1,5] <- matrix[1,1] * matrix[5,5]
d[1,6] <- matrix[1,2] * matrix[5,6]
d[2,3] <- matrix[2,1] * matrix[4,3]
d[2,4] <- matrix[2,2] * matrix[4,4]
d[2,5] <- matrix[2,1] * matrix[6,5]
d[2,6] <- matrix[2,2] * matrix[6,6]
d[3,1] <- matrix[3,3] * matrix[1,1]
d[3,2] <- matrix[3,4] * matrix[1,2]
d[3,5] <- matrix[3,3] * matrix[5,5]
d[3,6] <- matrix[3,4] * matrix[5,6]
d[4,1] <- matrix[4,3] * matrix[2,1]
d[4,2] <- matrix[4,4] * matrix[2,2]
d[4,5] <- matrix[4,3] * matrix[6,5]
d[4,6] <- matrix[4,4] * matrix[6,6]
d[5,1] <- matrix[5,5] * matrix[1,1]
d[5,2] <- matrix[5,6] * matrix[1,2]
d[5,3] <- matrix[5,5] * matrix[3,3]
d[5,4] <- matrix[5,6] * matrix[3,4]
d[6,1] <- matrix[6,5] * matrix[2,1]
d[6,2] <- matrix[6,6] * matrix[2,2]
d[6,3] <- matrix[6,5] * matrix[4,3]
d[6,4] <- matrix[6,6] * matrix[4,4]
有没有一种循环或其他方式可以更有效地解决这个问题的代码?