在R中展开矩阵

时间:2018-01-12 10:50:37

标签: r list matrix rows

我想将线性程序的约束放在矩阵的行中。 我从列表的元素中获取约束,但列表的几个元素由零向量组成。相应的约束在我的情况下并不重要,也不必在约束矩阵中。

是否有办法提前定义矩阵,以便您可以继续向矩阵添加行,而无需担心矩阵的大小。您只想继续向矩阵添加行,最后您将看到矩阵有多少行。

以下是目前的代码:

int main(){
xmlDocPtr pDoc = xmlReadFile("/var/www/db/db_policy.xml", NULL, XML_PARSE_NOBLANKS | XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_NONET);
    if (pDoc == NULL)
    {
        fprintf(stderr, "Document not parsed successfully.\n");
        return 0;
    }

root_element = xmlDocGetRootElement(pDoc);
if (root_element == NULL)
 {
        fprintf(stderr, "empty document\n");
        xmlFreeDoc(pDoc);
        return 0;
    }

printf("Root Node is %s\n", root_element->name);



        xmlChar* srcaddr = "5.5.5.5";
        xmlChar *xpath = (xmlChar*) "//srcAddr";
        xmlNodeSetPtr nodeset;
        xmlXPathObjectPtr result;
        int i;
        xmlChar *keyword;
        xmlXPathContextPtr context;
        xmlNodePtr resdev;
        xmlChar* resd;
         context = xmlXPathNewContext(pDoc);
        if (context == NULL) {
                printf("Error in xmlXPathNewContext\n");
        }
        result = xmlXPathEvalExpression(xpath, context);
        xmlXPathFreeContext(context);
        if (result == NULL) {
                printf("Error in xmlXPathEvalExpression\n");
        }
         if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
                xmlXPathFreeObject(result);
                printf("No result\n");
        };

        if (result) {
                nodeset = result->nodesetval;
                for (i=0; i < nodeset->nodeNr; i++) {
                        keyword = xmlNodeListGetString(pDoc, nodeset->nodeTab[i]->xmlChildrenNode, 1);
                printf("keyword: %s\n", keyword);
                if(strcmp(keyword, srcaddr) == 0){
                        xmlNodePtr pNode = xmlNewNode(0, (xmlChar*)"service");
                        xmlNodeSetContent(pNode, (xmlChar*)"nonser");
                        xmlAddSibling(result, pNode);
                        printf("added");
                        }
                xmlFree(keyword);
                }
                xmlXPathFreeObject (result);
        }
        xmlFreeDoc(pDoc);
        xmlCleanupParser();
        return (1);
}

B<-matrix(HERE TO DO THE TRICK SUCH THAT THE FOR LOOP BELOW GIVES NO ERROR) for (i in 1:(length(cars))){ if (sum(cars[[i]])) > 0{ B[i,]<-cars[[i]] } } 是一个列表,在每个元素中都有一个向量。 我不想取消列表因为我的列表太大而且由于我想要摆脱具有由零组成的向量的元素。

2 个答案:

答案 0 :(得分:0)

我会创建一个NA&#39>的矩阵

B <- matrix(NA, ncol = length(cars[[1]]), nrow = (length(cars)))

然后运行你的循环来填充矩阵

for (i in 1:(length(cars))){
  if (sum(cars[[i]])) > 0{
      B[i,]<-cars[[i]]
  }
}

并在此之后排除NA的所有行

B <- B[-which(is.na(B[ ,1])), ]

答案 1 :(得分:0)

我推荐rbind()。它组合了多个数据帧(或矩阵)的行。请参阅cbind()以合并列。

cars <- 1:5
B <- NULL
for(i in 1:length(cars)){
  B <- rbind(B, mtcars[i, ])
}
B
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2

要组合多个多维数组,请参阅abind包。