我有一个对称矩阵和一个适用于行和列的特定分组。我试图根据这个特定的分组只对那些行和列求和。
例如,我有一个4 x 4矩阵。我也有一个特定的分组,如1,1,2,2。也就是说,行和列1和2属于组1,而行和列3和4属于组2.我想将函数rowSums或rowsum应用于组约束:
我的矩阵:
[,1] [,2] [,3] [,4]
[1,] 0 1 0 0
[2,] 1 0 1 0
[3,] 0 1 0 3
[4,] 3 0 0 0
直观地帮助解决我的问题,分组1,1,2,2基本上意味着以下内容:
[,1] [,2] [,3] [,4]
[1,] 0 1 NA NA
[2,] 1 0 NA NA
[3,] NA NA 0 3
[4,] NA NA 0 0
将rowSums应用于原始矩阵将产生:
[1] 1 2 4 3
此外,应用允许传递组的rowsum仅将分组应用于行,并仍然对不属于该组的列进行求和:
[,1] [,2] [,3] [,4]
1 1 1 1 0
2 3 1 0 3
这是一个问题的原因是因为我试图在每个组中找到最小值。由于上面包含不属于该组的列,因此结果不正确。我可以繁琐地遍历分组并应用rowSums来获得每组的总和,然后找到最小值:
rowSums(mat[c(1,2),c(1,2)])
[1] 1 1 <- minimum is 1
rowSums(mat[c(3,4),c(3,4)])
[1] 3 0 <- minimum is 0
但是,我有一个大矩阵,这种方法不实用。我很确定这是一种更有效,更简单的方法,但我似乎无法找到它。理想情况下,我希望输出类似于:
1 1 2 2 <- grouping
1 1 3 0
甚至
[,1] [,2] [,3] [,4]
1 1 1 Inf Inf
2 Inf Inf 3 0
任何建议都将不胜感激。
感谢。
修改
我正在调整我的问题以下内容。鉴于我的原始矩阵:
[,1] [,2] [,3] [,4]
[1,] 0 1 0 0
[2,] 1 0 1 0
[3,] 0 1 0 3
[4,] 3 0 0 0
和特定的分组:
groups<-c(1,1,2,2)
我可以通过遍历组来实现所需的输出:
groups<-c(1,1,2,2)
for(i in 1:length(groups))
{
mat[i,which(groups[i]!=groups)]<-NA
}
mat
[,1] [,2] [,3] [,4]
[1,] 0 1 NA NA
[2,] 1 0 NA NA
[3,] NA NA 0 3
[4,] NA NA 0 0
如何在不使用低效循环的情况下实现这一目标?
答案 0 :(得分:1)
也许这有帮助
sapply(split(mat, kronecker(matrix(1:4, nrow=2, byrow=TRUE),
matrix(1, 2, 2))), function(x) rowSums(matrix(x, ncol=2)))
# 1 2 3 4
#[1,] 1 0 1 3
#[2,] 1 1 3 0
说明
kronecker(matrix(1:4, nrow=2, byrow=TRUE), matrix(1, 2, 2))
# [,1] [,2] [,3] [,4]
#[1,] 1 1 2 2
#[2,] 1 1 2 2
#[3,] 3 3 4 4
#[4,] 3 3 4 4
两个数组的kronecker
乘积返回分组索引,如上所示。用它来split
矩阵
split(mat, kronecker(matrix(1:4, nrow=2, byrow=TRUE),
matrix(1, 2, 2)))
#$`1`
#[1] 0 1 1 0
#$`2`
#[1] 0 1 0 0
#$`3`
#[1] 0 3 1 0
#$`4`
#[1] 0 0 3 0
返回list
vector
个
将vector
转换为matrix
并通过rowSums
list
循环sapply
获取 $scope.homepageSearch = function(search) {
homepagesearchService.getData(search).then(function(data) {
$scope.result = data;
DataService.set(data);
// and move to another page using $state.go('whatever page you want')
console.log(data);
});
}
//in that page load data from service
var data = DataService.get()// and here you can use that data
//in service
//make a var holdingdata; like
set(data){
holdingdata = data;
}
get(){
return holdingdata;
}