我有一个文件,其数据列表如下:
0, 2, 10
10, 8, 10
10, 10, 10
10, 16, 10
15, 10, 16
17, 10, 16
Run Code Online (Sandbox Code Playgroud)
我希望能够输入文件并将其拆分为三个数组,在此过程中修剪所有多余的空格并将每个元素转换为整数.
出于某种原因,我无法在c ++中找到一种简单的方法.我唯一的成功就是将每一行输入到一个数组中,然后重新修整所有空格然后将其拆分.整个过程花了我很多20-30行代码,并且修改另一个分隔符(例如空格)等很难.
这是我希望在C++中使用的python:
f = open('input_hard.dat')
lines = f.readlines()
f.close()
#declarations
inint, inbase, outbase = [], [], []
#input parsing
for line in lines:
bits = string.split(line, ',')
inint.append(int(bits[0].strip()))
inbase.append(int(bits[1].strip()))
outbase.append(int(bits[2].strip()))
Run Code Online (Sandbox Code Playgroud)
在python中使用这种方法的难易程度是我首先转向它的原因之一.但是,我现在需要在C++中执行此操作,我不想使用我丑陋的20-30行代码.
任何帮助将不胜感激,谢谢!
这是我的示例代码.它是高斯塞德尔(矩阵求解器)的迭代过程.基本上当错误足够小时,它会突破while循环.
i=1
while (i>0):
x_past = x_present
j=0
while(j<3):
value=0
k=0
while(k<3):
if(k!=j):
if(i==1):
if(k>j):
value=value+0
else:
value=value+x_present[k]*eqn[j][k]
else:
value=value+x_present[k]*eqn[j][k]
else:
value=value+eqn[j][k]
k=k+1
x_present[j:j+1]=[value]
j=j+1
print "X_PAST"
print x_past
print "X_PRESENT"
print x_present
if(error(x_past, x_present)<10**-2):
break;
i=i+1
Run Code Online (Sandbox Code Playgroud)
我减少了代码,使其更易于管理.如果你不明白它的作用,解决这个问题并不是那么重要.
这是问题所在.每次
x_present[j:j+1]=[value]
Run Code Online (Sandbox Code Playgroud)
运行时,x_past等于x_present.我不知道为什么会这样,因为我设置的x_past等于x_present的唯一位置是在循环的顶部.如果我带走了
x_past=x_present
Run Code Online (Sandbox Code Playgroud)
句子,x_past永远不会等于x_present.这使我认为这是导致问题的两个陈述的某种组合.
如果每次x_past = x_present错误= 0并且第一次迭代后循环中断,则这是一个很大的问题.代码确实有效,例如,如果我告诉代码运行8次迭代并且中断它给了我应该的答案.
在过去的4个小时里,我一直在努力解决这个问题,而且我完全被困住了.我没有使用python很长时间,所以我的麻烦射击技巧语法明智不是那么好.任何帮助,将不胜感激!!
我似乎在漂浮物上失去了很多精确度.
例如,我需要解决一个矩阵:
4.0x -2.0y 1.0z =11.0
1.0x +5.0y -3.0z =-6.0
2.0x +2.0y +5.0z =7.0
Run Code Online (Sandbox Code Playgroud)
这是我用来从文本文件导入矩阵的代码:
f = open('gauss.dat')
lines = f.readlines()
f.close()
j=0
for line in lines:
bits = string.split(line, ',')
s=[]
for i in range(len(bits)):
if (i!= len(bits)-1):
s.append(float(bits[i]))
#print s[i]
b.append(s)
y.append(float(bits[len(bits)-1]))
Run Code Online (Sandbox Code Playgroud)
我需要使用gauss-seidel解决,所以我需要重新排列x,y和z的方程式:
x=(11+2y-1z)/4
y=(-6-x+3z)/5
z=(7-2x-2y)/7
Run Code Online (Sandbox Code Playgroud)
这是我用来重新排列方程的代码.b是系数矩阵,y是答案向量:
def equations(b,y):
i=0
eqn=[]
row=[]
while(i<len(b)):
j=0
row=[]
while(j<len(b)):
if(i==j):
row.append(y[i]/b[i][i])
else:
row.append(-b[i][j]/b[i][i])
j=j+1
eqn.append(row)
i=i+1
return eqn
Run Code Online (Sandbox Code Playgroud)
然而,我得到的答案并不精确到小数位.
例如,在重新排列上面的第二个等式时,我应该得到:
y=-1.2-.2x+.6z
Run Code Online (Sandbox Code Playgroud)
我得到的是:
y=-1.2-0.20000000000000001x+0.59999999999999998z
Run Code Online (Sandbox Code Playgroud)
这似乎不是一个大问题,但是当你将数字提高到一个非常高的功率时,错误是非常大的.有没有解决的办法?我尝试了这个Decimal课程,但是它在功能方面效果不佳(即Decimal(x)**2 …
我有4个二进制位
Bit 3 Bit 2 Bit 1 Bit 0
Run Code Online (Sandbox Code Playgroud)
通常答案很简单:2 ^ 4,或16种不同的组合; 它看起来像下面这样:
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
但是,LSB(位0)每次迭代都会改变状态.
我需要一种算法,其中一个位的状态仅在所有迭代中改变一次; 即,我需要所有的位像MSB(位3).
我怎样才能做到这一点?
似乎大多数人正在融合只有5种可能的解决方案.然而,这假设有一个起点和一个终点.这无所谓,所以我将给出一个真实世界的场景来更好地解释.
假设我有一个数字闹钟,可以提供4个输出.每个输出可以被编程为在特定时间继续并且在特定时间关闭并且彼此独立地编程,例如.我可以将输出1编程为上午1点和凌晨3点关闭,而我可以将输出2编程为下午7点和下午2点关闭.每个输出可以保持多长时间没有限制.
现在我想把这个闹钟挂在电脑上,尽可能接近当前的正确时间.即如果时钟表示时间是下午2:15,我的计算机就知道警报在下午12点到下午6点的范围内.我希望能够获得尽可能小的范围.什么是我能得到的最小范围?