通过指定对角线在R中创建矩阵

时间:2019-01-23 16:34:16

标签: r matrix

我正在尝试找到创建以下矩阵的最有效方法。

> 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中找不到等效函数。所以我想知道是否存在一种无需手动输入数字即可创建该矩阵的方法。

3 个答案:

答案 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