我正在尝试找到创建以下矩阵的最有效方法。
> t(A)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 0 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
[2,] 0 0.125 0.875 0.000 0.000 0.000 0.000 0.000 0.000
[3,] 0 0.000 0.250 0.750 0.000 0.000 0.000 0.000 0.000
[4,] 0 0.000 0.000 0.375 0.625 0.000 0.000 0.000 0.000
[5,] 0 0.000 0.000 0.000 0.500 0.500 0.000 0.000 0.000
[6,] 0 0.000 0.000 0.000 0.000 0.625 0.375 0.000 0.000
[7,] 0 0.000 0.000 0.000 0.000 0.000 0.750 0.250 0.000
[8,] 0 0.000 0.000 0.000 0.000 0.000 0.000 0.875 0.125
[9,] 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000
对于NumPy
,我习惯于通过填充上下对角线来实现。但是,我在R中找不到等效函数。所以我想知道是否存在一种无需手动输入数字即可创建该矩阵的方法。
答案 0 :(得分:3)
x = seq(0,1,0.125)
m = diag(x)
m[col(m)==row(m)+1]=rev(x[-1])
m
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 0 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
[2,] 0 0.125 0.875 0.000 0.000 0.000 0.000 0.000 0.000
[3,] 0 0.000 0.250 0.750 0.000 0.000 0.000 0.000 0.000
[4,] 0 0.000 0.000 0.375 0.625 0.000 0.000 0.000 0.000
[5,] 0 0.000 0.000 0.000 0.500 0.500 0.000 0.000 0.000
[6,] 0 0.000 0.000 0.000 0.000 0.625 0.375 0.000 0.000
[7,] 0 0.000 0.000 0.000 0.000 0.000 0.750 0.250 0.000
[8,] 0 0.000 0.000 0.000 0.000 0.000 0.000 0.875 0.125
[9,] 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000
>
答案 1 :(得分:0)
我不知道这是否是最有效的方法,但我希望这是您想要的。
bool writeToVTK( const std::vector< Eigen::Matrix<double,3,1> > &pointVector )
{
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
points->SetDataTypeToDouble();
points->SetNumberOfPoints(pointVector.size());
vtkSmartPointer<vtkCellArray> vertices = vtkSmartPointer<vtkCellArray>::New();
vertices->SetNumberOfCells(pointVector.size());
for(int i = 0; i < pointVector.size(); ++i)
{
points->SetPoint( i, pointVector[i](0), pointVector[i](1), pointVector[i](2) );
vtkSmartPointer<vtkVertex> vertex = vtkSmartPointer<vtkVertex>::New();
vertex->GetPointIds()->SetId(0, i);
vertices->InsertNextCell(vertex);
}
std::cout << vertices->GetNumberOfCells() << std::endl;
vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
polyData->SetPoints(points);
polyData->SetVerts(vertices);
vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
writer->SetHeader("Surface Type : ");
writer->SetFileName("test.vtk");
writer->SetInputData(polyData);
writer->Write();
return true;
}
答案 2 :(得分:0)
我不知道有任何函数可以通过这种通用方式实现。
我的解决方案是通过循环:
ma <- matrix(0, ncol = 9, nrow = 9)
rate = 0.125
for(i in 1:nrow(ma)){
for(j in 1:ncol(ma)){
if(i == j){
ma[i,j] = rate*(i-1)
} else if(j == i + 1){
ma[i,j] = 1 - rate*(i-1)
}
}
}
ma