[英]code does not work with arrays (multiple arrays in arraylist)
嗨,我在數組上有一點問題。
這是代碼:
int frame_size = 410;
int frame_shift = 320;
ArrayList<double[]> frames = new ArrayList<double[]>();
for (int i = 0; i + frame_size < inbuf.length; i = i + frame_shift) {
double[] frame = new double[frame_size];
System.arraycopy(inbuf, i, frame, 0, frame_size);
frames.add(frame);
}
在這里,我將一個大數組分成幾個小數組,並將它們添加到arraylist
我需要獲取更多的ArrayList數組並將它們傳遞給函數,然后接受答案並組合處理的數組:
int[] Cover = new int[frames.size() * nParam];
for (int i = 0; i < frames.size(); i++) {
double[] finMc = Gos.getVek(frames.get(i));
for (int c = 0; c < finMc.length; c++) {
int mc = (int) finMc[c];
for (int m = 0; m < Cover.length; m++) {
Cover[m] = mc;
}
}
}
所有這些代碼均無效(
數組的所有元素均為零Cover。
Сover[0] = 0
Cover[1] = 0
Cover[2] = 0
...
請幫助解決問題!)
先感謝您)
更新資料
int frame_size = 410;
int frame_shift = 320;
ArrayList<double[]> frames = new ArrayList<double[]>();
for (int i = 0; i + frame_size < inbuf.length; i = i + frame_shift) {
double[] frame = new double[frame_size];
System.arraycopy(inbuf, i, frame, 0, frame_size);
frames.add(frame);
}
int[] Cover = new int[frames.size() * nParam];
for (int i = 0; i < frames.size(); i++) {
double[] finMc = Gos.getVek(frames.get(i));
for (int c = 0; c < finMc.length; c++) {
int mc = (int) finMc[c];
Cover[i * frames.size() + c] = (int) finMc[c];
}
}
代碼^不起作用(
更新2
double[] inbuf = new double[Size];
inbuf = toDoubleArray(Gos.data);
inbuf[2] = 10;
inbuf[4] = 14;
toDoubleArray
public static double[] toDoubleArray(byte[] byteArray) {
int times = Double.SIZE / Byte.SIZE;
double[] doubles = new double[byteArray.length / times];
for (int i = 0; i < doubles.length; i++) {
doubles[i] = ByteBuffer.wrap(byteArray, i * times, times)
.getDouble();
}
return doubles;
}
代碼不起作用:
int frame_size = 410;
int frame_shift = 320;
ArrayList<double[]> frames = new ArrayList<double[]>();
for (int i = 0; i + frame_size < inbuf.length; i = i + frame_shift) {
double[] frame = new double[frame_size];
System.arraycopy(inbuf, i, frame, 0, frame_size);
frames.add(frame);
}
double[] Cover = new double[frames.size() * nParam];
for (int i = 0; i < frames.size(); i++) {
double[] finMc = Gos.getVek(frames.get(i));
for (int c = 0; c < finMc.length; c++) {
Cover[i * frames.size() + c] = finMc[c];
}
}
立刻想到了一些想法:
1) for (int m = 0; m < Cover.length; m++) { Cover[m] = mc; }
for (int m = 0; m < Cover.length; m++) { Cover[m] = mc; }
這個塊開始m
超過在0
通過循環每一次。 這意味着您總是在Cover
數組的同一部分上進行書寫。 如此有效,它僅存儲了最后一幀的數據。 你可能是說
for(int m = i * frames.size(); m < (i+1)*frames.size(); i++) {
Cover[m] = mc;
}
但這又引發了一個問題-您正在將相同的值( mc
)寫入為整個數據幀分配的整個區域。 您可能希望將此循環與上一個循環合並,以免發生這種情況。
for (int c = 0; c < finMc.length; c++) {
Cover[i * frames.size() + c] = (int)finMc[c];
}
2) int mc = (int) finMc[c];
該行將值強制轉換為一個int
,該int
將截斷存儲在finMc[c]
處的值。 如果finMc[c]
在0
到1
之間,則在復制和finMc[c]
數據時將產生0
。 上一期的問題更加復雜,該問題可確保僅復制最后一幀的數據。 只需刪除強制類型轉換並將Cover聲明為double
而不是int
的數組即可解決。
因此,總而言之,如果以這種方式編寫,則代碼可能會更好一些:
double[] Cover = new double[frames.size() * nParam];
for (int i = 0; i < frames.size(); i++) {
double[] finMc = Gos.getVek(frames.get(i));
for (int c = 0; c < finMc.length; c++) {
Cover[i * frames.size() + c] = finMc[c];
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.