1

在 Matlab 中,我使用 oracles 数据提供程序来查询 oracle 数据库。我想用结果填充一个 matlab 矩阵或二维数组。我是一个 .NET 人,但在 Matlab 中并不强。我们有使用 Matlab 但对 .NET 一无所知的分析师,因此我们陷入了困境。我们不想为他们拥有的 Matlab 数据库工具包提供 2k,这就是我们使用 .NET 从 Matlab 查询数据库的原因。

有什么想法可以轻松地将数据表从 .NET 转换为 matlab 中的矩阵或二维数组吗?请注意,我们使用的是 ODP.NET,因此不存在正常的 ADO.NET GetRows()。如果我们将 MS 的 OLE 用于 oracle,但 PC 是 Win 7 64 位并且 MS 在该平台上不再支持 oracle,这就是我将使用的。您必须使用 oracles ODP,这就是我们正在使用的。使用其他任何东西都不是 atm 的选项,因此解决方案需要牢记这一点。

目前我能够查询数据库,并遍历每一行/列,但在添加到矩阵时遇到问题。即因为我需要将数字或字符串都存储在矩阵中,并且在遍历每一列时我得到了转换类型,但由于某种原因 strcmp() 没有返回匹配项,即使它看起来应该:

for r = 1:rowCount
    for c = 1:colCount
        type = tbl.Rows.Item(r).Item(c).GetType().ToString();
        val = tbl.Rows.Item(r).Item(c);
        if strcmp(type,'System.Decimal') == 1
            m(r, c) = tbl.Rows.Item(r).Item(c).ToDouble();
        elseif strcmp(type, 'System.String' == 1) || strcmp(type, 'System.DateTime' == 1)
            m(r, c) = tbl.Rows.Item(r).Item(c).ToString();
        end
        m(r, c) = tbl.Rows.Item(r).Item(c).ToString();
    end
end

考虑到这一点,我怎样才能让矩阵或二维数组接受任何类型的数据?如果你愿意的话,一个变种。我在做 m = zeros(rowCount, colCount); 但这似乎使它期望数字,这是有道理的,但我仍然希望同时保存数字和字符串,并让用户找出他们希望进行数学运算的列。

4

1 回答 1

1

这条线是有问题的:

 strcmp(type, 'System.String' == 1)

它不是测试type等于System.String,而是检查是否'System.String' == 1与 相同的字符串type

我建议将其更改为

 isequal(type,'System.String');

或者更好的是,更喜欢switchif-elseif因为它可以节省您的代码行:

  switch type
    case 'System.Decimal'
        m(r, c) = tbl.Rows.Item(r).Item(c).ToDouble();
    case {'System.String', 'System.DateTime')
        m(r, c) = tbl.Rows.Item(r).Item(c).ToString();
    otherwise
        assert(false);
    end

发生这种情况是因为 switch 可以处理字符串参数,并正确比较它们。

于 2012-06-11T18:53:50.273 回答