返回首页

介绍
在C和C作为一个数组,二维数组表示阵列。数组类型是每个元素的相同,行主要为了在使用数组下标操作符访问一个元素。例如,我们可能有:

int array[10][10];

...

array[0][0] = 1;

二维数组是有用的,在许多应用,包括数学编程和数据的代表性。例如,一个系统展示股票的历史价格可能会使用一个矩阵来存储数据点给定的天。每列代表一天,每行可代表了一天的点集。在这样一个系统,一个可能会受到诱惑使用XML流出来的数据,然而,这是没有必要的。 XML的有时增加了数据处理时间,并扩大了实际不必要的传输数据的大小。
建在二维数组一定的局限性。特别是,它不能轻易调整阵列允许程序员添加另一行,或添加其他列。功能添加和删​​除行和列是代表试算表喜欢数据。例如,用户可能需要添加另一套数据点代表某一天的股票价格。这创造其目的是封装此行为的C类矩阵。 背景
矩阵类是一个类,允许二维数组表示。类被开发为一个C模板,允许用户指定哪些基本类型是的元素。然而,它使用矢量方法的载体实现允许使用C数组下标操作符,如果矩阵类一个内置的数组类型的数组。类;但是,保留的能力来调整行和列。
例如,下面是可能的(其中"D"是一个向量的向量):{C}
除了数组的下标操作符支持,班上有能力允许用户添加行或添加一列,以及删除行或删除列的能力。例如,以下也是可能的:
matrix<int> m(2,4);

...

// Test delete row

m.del_row(3);

cout < < m;

...

// Test add row

matrix<int>::matrix_row_t row;

row.resize(4);

for(int i = 0; i < 4; i++) {

     row[i]=100;

}

m.add_row(3,row);

cout < < m;

注意代码是如何不使用XML作为一个内部表示。相反,它依赖于STL的。类的核心执行基于以下逻辑:{体C3}
类提供下列方法添加和删除行或列:{的C4}
代码执行附加行和添加列操作比人们想象的稍微复杂,但仍然可读。我们的想法是先建立一个临时矩阵调整大小一个适当的行或列。然后添加的代码首先复制新的行或列现有的调整大小的临时矩阵的矩阵数据然后添加新的行或列在适当的位置。同样,删除行或列需要创建一个调整大小的临时矩阵和复制领域,我们希望保持到一个临时矩阵。在结束矩阵操作,然后将更新与新的临时矩阵。请注意,做这些类型的操作使用XML作为底层表示没有必要或有效。其最佳存储使用STL容器和执行操作的数据容器。作为一个例子,考虑下面的代码'add_row":{C5的}
此外,用户可以调整的矩阵的行和列。类也支持调试ostream的运营商和流和数据流以及有方法倾倒在HTML输出的能力。{5233}使用代码
代码是易于使用,并允许用户添加和删除行和列类以及调整行和列。一个例子使用可能是:{C7-}景点
代码完成流和流出来的内部数据,而无需使用XML。当流出来的数据,行和列大小行大订单数据输出。所有的元素都使用单一的空白字符分隔。当流中读取的行和列的大小和读取数据流进入矩阵。这使我们在一个紧凑的格式的数据存储和传输,在网络如果有必要的连接。类的目的是要保持整数和浮点数点的数据。
使用XML流中的数据其实是非常昂贵的。例如,如果矩阵有1000行,每一个代表元素和1000列一个整数,那么我们就需要最低1000000字节流数据。如果XML被用来包裹如使用标记的每个点:{C8的}
,然后为每一个整数,我们将增加一个额外的17字节数据。此外,我们还需要确定使用标记的行和列。当然,这需要使用一个XML处理器,这将被处理进一步增加处理时间和代码的复杂性。然而,矩阵类流出来,流在运营商,我们已以下的简单而有效的逻辑,无论是在空间方面和时间复杂度:
string stream_out() const

   {

      ostringstream out;

      out << row << " " << col << " ";

      for(int i = 0; i < row; i++) {

         for(int j = 0; j < col; j++) {

            out << m[i][j] << " ";

         }

      }

      return out.str();

   }

   void stream_in(string _m)

   {

      istringstream in(_m,istringstream::in);

      in >> row;

      in >> col;

      m.resize(row);

      for(int i = 0; i < row; i++) {

         m[i].resize(col);

      }

      for(int i = 0; i < row; i++) {

         for(int j = 0; j < col; j++) {

            in >> m[i][j];

         }

      }

   }

回答

评论会员:游客 时间:2012/02/06
你要跟应该有对XML在{A}深沉的样子...玩得开心!牛仔戴维你做的少,你做
wtwhite:请参阅我的其他评论
评论会员:wtwhite 时间:2012/02/06
我百思不得其解的事实,你不使用你为什么XML的 - 什么XML必须做的矩阵?它像提的是,你不存储在关系数据库中的矩阵!

至于代码本身,它似乎罚款,除了矩阵类的接口需要提取整行或整列的副本,即使用户访问一个单一的元素,这是非常低效的事实。还有一些你的代码是相当冗长。你有没有意识到,使用一个单一的任务,可以复制整个向量?这将节省您的行的所有元素不少循环。可以简单地实现你add_row()和del_row()为:
{C10的}
这也将是比你的代码速度更快,因为他们(通常)避免创建矩阵的一个新副本 - vectorlt; TGT; :: insert()和vectorlt; TGT; ::擦除()内部工作调其随后所有的元素一个元素向前或向后,离开之前的所有元素不变(例外被插入()如果需要分配更多的内存)。

我们没有理由感到羞耻,如果你只是学习和演奏与C是你的代码,但真的有没有造福他人,在这里,我可以看到
评论会员:游客 时间:2012/02/06
JohnWallis42:应用数学,呵呵它是如何公平乘以2200万维矩阵或矩阵求逆是怎么回事?{S0的}
PIEBALDconsult
评论会员:游客 时间:2012/02/06
?是真的你参考如何拼写他的名字这篇文章是如何从一个在本月早些时候发布的不同