您好,我需要计算文件的阶m的熵,其中m是位数(m < = 16)。Stream of short []
所以:
H_m(X)= - sum_i = 0到i = 2^m-1个{(P_I,M)(log_2(P_I,M))}
所以,我想创建一个输入流来读取文件,然后计算每个由m位组成的序列的概率。
对于m = 8,这很容易,因为我考虑了一个字节。 由于这个m < = 16我试图考虑为原始类型short,将short的每个short存储在数组short []中,然后使用按位运算符处理位以获取文件中所有m位的序列。 这是个好主意吗?
无论如何,我无法创建一个短的流。这是我所做的:
public static void main(String[] args) {
readFile(FILE_NAME_INPUT);
}
public static void readFile(String filename) {
short[] buffer = null;
File a_file = new File(filename);
try {
File file = new File(filename);
FileInputStream fis = new FileInputStream(filename);
DataInputStream dis = new DataInputStream(fis);
int length = (int)file.length()/2;
buffer = new short[length];
int count = 0;
while(dis.available() > 0 && count < length) {
buffer[count] = dis.readShort();
count++;
}
System.out.println("length=" + length);
System.out.println("count=" + count);
for(int i = 0; i < buffer.length; i++) {
System.out.println("buffer[" + i + "]: " + buffer[i]);
}
fis.close();
}
catch(EOFException eof) {
System.out.println("EOFException: " + eof);
}
catch(FileNotFoundException fe) {
System.out.println("FileNotFoundException: " + fe);
}
catch(IOException ioe) {
System.out.println("IOException: " + ioe);
}
}
但我失去了一个字节,我不认为这是程序的最佳途径。
这是我想使用位运算符的事:
int[] list = new int[l];
foreach n in buffer {
for(int i = 16 - m; i > 0; i-m) {
list.add((n >> i) & 2^m-1);
}
}
我假设在这种情况下使用短裤。 如果我使用字节,我怎么能做一个类似于m> 8的循环? 该周期不起作用,因为我必须连接多个字节,并且每次都要改变要连接的位数。
任何想法? 感谢
如果您只是计算总和,为什么要将每个值保存在一个数组中? – VGR
感谢您的回复。我需要将值保存在数组中,因为我需要获取m位的所有子序列,然后计算每个序列的概率。 – lon