0

Matlab でプログラムを作成する必要があります。多くのファイルを処理するため、パフォーマンスは非常に重要です。

ファイル名の最後のファイル拡張子を見つけて、そこで分割する必要があります。

たとえば、file.name.tar.gzと に分割する必要がありますfile.name.targz

これを行う 3 つの方法を特定しましたが、どれが最速かはわかりません。

1.

javaFilename = java.lang.String(fileName);
lastDot = javaFilename.lastIndexOf('.');
name = char(javaFilename.substring(0, lastDot-1));    
ext = char(javaFilename.substring(lastDot+1));

2.

dots = findstr(fileName, '.');
lastDot = dots(length(dots));
name = fileName(1:lastDot-1);
ext = fileName(lastDot+1:end);    

3.

[name tempExt] = strtok(fileName, '.');
while tempExt
    [temp2 tempExt] = strtok(fileName, '.');
    if tempExt
       name = strcat(name, '.', temp2);
    end
end
ext = temp2(2:end);

3番目は最悪だと思います。しかし、他の方法はどうですか?私が説明した方法よりも速い方法を思いつくことができますか?

4

2 に答える 2

2

これらをテストするには、次のようにします。

tic;
fileName = 'testFileName.ext';
for i=1:100000
  <find last dot>
end
toc;

あなたのベンチマークを行ったところ、2 番目の方がはるかに高速であることがわかりました。

私の解決策は

for index=length(fileName):-1:1
  if (fileName(index) == '.')
    break;
  end
end

私が得た時間は次のとおりです。

Java ソリューション: 23 秒

findstr 解: 0.4 秒

strtok 解決策: (終了しませんでした。間違ってコピーしたのかもしれません)

逆 for ループの解: 0.01 秒

findstr と strtok に対する私のソリューションの利点は、次のとおりです。a) すべてのドットではなく、1 つのドットのみを検索します。b) 文字列の末尾から開始します (おそらく、ほとんどのファイル拡張子は 2 ~ 4 文字の長さになります)。

于 2012-05-14T08:52:41.607 に答える
1

組み込みコマンドfilepartsは必要なことを行いますが、おそらく必要のないオーバーヘッド/エラーチェックなどがかなりあります。100 前後の行を見ると、

ind = find(name == '.', 1, 'last');

ext = name(ind:end);
name(ind:end) = [];

name入力ファイル名です。これはあなたの 2 番目の提案とかなり似ています - 少し速いか遅いかもしれませんが、私はタイミングを計っていません。

于 2012-05-14T09:19:18.970 に答える